首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在bash中忽略带有空格的文件和目录?

为什么在bash中忽略带有空格的文件和目录?
EN

Stack Overflow用户
提问于 2013-10-22 09:37:19
回答 3查看 97关注 0票数 0

我有一个脚本,它应该遍历执行它的目录和子目录,搜索特定的文件类型,比如pdf,然后删除它们,然后创建一个空文件,其中包含已删除的文件的名称。除了忽略文件和文件夹(它们的名称中包含空格)外,它工作得很好。下面是脚本:

代码语言:javascript
运行
复制
#!/bin/sh

#
#  Created by User on 6/20/11.
#

dir=./
for files in $(find -L "$dir" -name '*.pdf' -mtime +90);
do
echo $files
rm -fR $files
touch $files.removed
done

谁能建议一个解决方案,如何使这个脚本处理所有文件和文件夹的任何类型的名称?

感谢并致以最良好的问候

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-22 09:39:24

IFS的默认值在遇到空格时会导致分词。可以这样说:

代码语言:javascript
运行
复制
for files in $(IFS=$'\n' find -L "$dir" -name '*.pdf' -mtime +90);

上面提到的IFS=$'\n'只会导致单词分裂只发生在换行符上,所以带有空格的文件名会很好地工作。

票数 3
EN

Stack Overflow用户

发布于 2013-10-22 09:51:21

我建议以这种方式使用您的脚本,并使用双引号:

代码语言:javascript
运行
复制
dir=./
while read files
do
   echo "$files"
   rm -fR "$files"
   touch "$files".removed
done < <(find -L "$dir" -name '*.pdf' -mtime +90)
票数 2
EN

Stack Overflow用户

发布于 2013-10-22 12:55:32

你问过任何名字。合法的文件名可以包括linefeed,因此任何假设linefeed的解决方案都会分隔两个文件名,这是不完全正确的。文件名中唯一不能出现的两个字符是/ (用于分隔路径组件)和null字符。

如果您的find版本支持它,则可以使用

代码语言:javascript
运行
复制
find -L "$dir" -name '*.pdf' -mtime +90 -print0

要处理这个问题,您需要xargs

代码语言:javascript
运行
复制
find -L "$dir" -name '*.pdf' -mtime +90 -print0 |
  xargs -0 -I %% sh -c 'echo "%%"; rm -fR "%%"; touch "%%.removed"'

如果您的find不支持-print0,则可以像使用xargs一样使用-exec

代码语言:javascript
运行
复制
find -L "$dir" -name '*.pdf' -mtime +90 -exec sh -c 'echo "{}"; rm -fR "{}"; touch "{}.removed"'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19514181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档