linux - 收集文件名的 bash 脚本似乎被空格弄糊涂了

标签 linux bash shell grep whitespace

我正在尝试构建一个脚本,列出一组目录中的所有 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/

相关文章:

linux - 在没有硬件调制解调器的 Linux 上模拟 PSTN 或 GS​​M

linux - 如何在 Intel CPU 上找到 L3 Cache 参数?

linux - 返回小于给定日期的月结束日期,并在 shell 中停止于 12 个日期

string - 排序列表并将排序后的值添加到 bash 中的新列表

linux - 根据条件重新排列列

bash - 如何从 CSV 文件中获取每一行的第一列?

c# - 在 .NET core 下的 Linux 上运行 .NET 4.5

linux - 使用 bash 脚本将文本转换为时间格式

linux - 在 bash 上对版本字符串进行排序

linux - 重定向 Bash 子脚本的输出