0

我有一个脚本,它应该遍历执行它的目录和子目录,并搜索特定的文件类型,比如 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

任何人都可以提出一个解决方案,如何让这个脚本处理所有具有任何名称的文件和文件夹?

谢谢和最好的问候

4

3 回答 3

3

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

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

上面说IFS=$'\n'的会导致分词只发生在换行符上,所以带空格的文件名会很好用。

于 2013-10-22T09:39:24.587 回答
2

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

dir=./
while read files
do
   echo "$files"
   rm -fR "$files"
   touch "$files".removed
done < <(find -L "$dir" -name '*.pdf' -mtime +90)
于 2013-10-22T09:51:21.137 回答
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"'
于 2013-10-22T12:55:32.790 回答