我不会执行for 循环,因为可能会使您的命令行超载。命令行的长度是有限的,如果你超载它,它会简单地删除多余的部分,而不会给你任何警告。如果您的 find 返回 100 个文件,它可能会起作用。如果它返回 1000 个文件,它可能会工作,但如果你的 find 返回 1000 个文件,它可能会失败,而你永远不会知道。
处理此问题的最佳方法是将 find 传递到 while read 语句中,如 glenn jackman。
sed 命令仅适用于 STDIN 和文件,但不适用于文件名,因此如果您想修改文件名,则必须执行以下操作:
$newname="$(echo $oldname | sed 's/old/new/')"
获取文件的新名称。 $() 构造执行命令并将命令的结果放在 STDOUT 上。
因此,您的脚本将如下所示:
find /home/devel/stuff/static/ -name "*.pdf" | while read $file
do
echo $file;
newfile="$(echo $file | sed -e 's/static/changethis/')"
newfile="$newfile.xml"
echo $newfile;
done
现在,由于您要重命名文件目录,因此您必须在移动或复制之前确保该目录存在:
find /home/devel/stuff/static/ -name "*.pdf" | while read $file
do
echo $file;
newfile="$(echo $file | sed -e 's/static/changethis/')"
newfile="$newfile.xml"
echo $newfile;
#Check for directory and create it if it doesn't exist
$dirname=$(dirname "$newfile")
if [ ! -d "$dirname" ]
then
mkdir -p "$dirname"
fi
#Directory now exists, so you can do the move
mv "$file" "$newfile"
done
注意引号以处理文件名中有空格的情况。
顺便说一句,不要这样做:
if [ ! -d "$dirname" ]
then
mkdir -p "$dirname"
fi
你可以这样做:
[ -d "$dirname"] || mkdir -p "$dirname"
|| 表示只有在测试不成立时才执行以下命令。因此,如果 [ -d "$dirname" ] 是错误语句(目录不存在),则运行 mkdir。
当您看到 shell 脚本时,这是一个相当常见的快捷方式。