gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:59 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com