我正在尝试构建一个脚本,列出一组目录中的所有 zip 文件,并使用一些过滤器并将它们吐出到文件中,但是当文件名中有空格时,它似乎出现在新行。
此列表最终将用作 tar 的输入以 gzip 所有 zip 文件,脚本如下:
#!/bin/bash
rm -f set1.txt
rm -f set2.txt
for line in $(find /home -type d -name assets ;);
do
echo $line >> set1.txt
for line in $(find $line -type f -name \*.zip -mtime +2 ;);
do
echo \"$line\" >> set2.txt
done;
这会按预期工作,直到文件名中出现空格,然后 set2.txt 包含如下条目:
"/home/xxxxxx/oldwebroot/htdocs/upload/assets/jobbags/rbjbCost"
"in"
"use"
"sept"
"2010.zip"
有谁知道我如何才能将这些带空格的文件名放在一行中,并将所有文件名都包含在一组引号中?
谢谢!
最佳答案
遍历位于 find
的一组文件的正确方法带有 while read 结构,因此:
while IFS= read -r -d '' line ; do
echo "$line" >> set1.txt
while IFS= read -r -d '' file ; do
printf '"%s"\n' "$file" >> set2.txt
done < <(find "$line" -type f -name \*.zip -mtime +2 -print0)
done < <(find /home -type d -name assets -print0)
为了清楚起见,我给内部循环变量起了一个不同的名字。
如果你没有 bash
你必须发出 find
单独命令并将输出重定向到文件,然后使用 while read ; do .. done < filename
读取文件.
请注意,每个变量的每个扩展都是双引号。这是必要的。
但是请注意,对于您想要的,您可以简单地使用 -printf
切换到 find
, 如果你有 GNU find
.
find /home -type f -path '*/assets/*.zip' -mtime +2 -printf '"%p"\n' > set2.txt
虽然,正如@sarnold 指出的那样,这并不安全。
关于linux - 收集文件名的 bash 脚本似乎被空格弄糊涂了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9498196/