为什么在bash中忽略了名称中包含空格的文件和目录?

时间:2013-10-22 09:37:20

标签: bash recursion space

我有一个脚本,它应该通过目录和子目录来执行它并搜索特定的文件类型,比如pdf,然后删除它们,然后用删除的文件名创建一个空文件。 它工作正常,除了它忽略文件和文件夹,其名称中包含空格。 这是脚本:

#!/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

任何人都可以建议一个解决方案如何让这个脚本处理任何类型名称的所有文件和文件夹?

谢谢和最好的问候

3 个答案:

答案 0 :(得分:3)

默认值IFS会在遇到空格时导致单词拆分。说:

for files in $(IFS=$'\n' find -L "$dir" -name '*.pdf' -mtime +90);

上面说IFS=$'\n'会导致单词拆分仅在换行符上发生,因此带空格的文件名可以正常运行。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

您确实询问了任何名称。合法文件名可以包含换行符,因此任何假定换行符分隔两个文件名的解决方案都不太正确。文件名中不能出现的唯一两个字符是/(用于分隔路径组件)和空字符。

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

获取以空值分隔的文件名列表
find -L "$dir" -name '*.pdf' -mtime +90 -print0

要处理此问题,您需要xargs

find -L "$dir" -name '*.pdf' -mtime +90 -print0 |
  xargs -0 -I %% sh -c 'echo "%%"; rm -fR "%%"; touch "%%.removed"'

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

find -L "$dir" -name '*.pdf' -mtime +90 -exec sh -c 'echo "{}"; rm -fR "{}"; touch "{}.removed"'