Find full path names of (.BMP) files under folder, append to file
我在一个文件夹中有11.bmp图像。我想创建一个文本文件,其中每一行都是图像名的完整路径。我使用了以下代码:
1 2 3 4 5 6 7 8 9 10
| #!/bin/bash
i=0
find -type f -iname"*.bmp" | while read x; do
echo $(cd $(dirname"$1") && pwd -P)/$(basename"$1") >>test2.txt
app=$( printf"%05d" ${i}).bmp
#echo $app
echo $(sed '${s/$/'"${app}"'/;}' test2.txt)
i=$((i+1))
done |
…但不起作用。所有图像都在这个路径中:/home/behzad/desktop/test/我想要一个文本文件,每行如下:/home/behzad/desktop/test/00000.bmp/主页/behzad/desktop/test/00001.bmp…/主页/behzad/desktop/test/00011.bmp
- 我想要这样的东西:home/behzad/desktop/test/00000.bmp
- 您有哪些find的实现?如果您有gnu find,您可以告诉它使用您自己想要的任何格式字符串。
- 顺便说一句,考虑在shellcheck.net上运行您的代码,并在这里提问之前修复它发现的所有问题。另外,详细地描述"工作"的含义,在这个问题中是很有帮助的——我们从阅读代码中知道代码的作用,但是您希望它做什么,只有您可以说。
- …回复:你的第一句话,你想要像/home/behzad/Desktop/test/00000.bmp那样的东西,/home/behzad/Desktop/test是什么?文件的当前位置?作为脚本参数提供的目录?还有别的吗?请参阅stackoverflow.com/help/mcve——代码示例应该包括重现问题所需的所有内容。在这种情况下,这意味着创建一个临时目录,其中包含一些虚拟文件名,并显示当使用特定命令行调用脚本时,应使用这些特定虚拟名称生成的输出。
- 顺便说一句,您可能还想看看bashfaq 100。在子shell中使用sed和basename会带来显著的性能损失——在循环中,如果可以的话,最好使用本地字符串操作原语。mywiki.wooledge.org/bashfaq/100
- 另一方面,printf -v app '%05d'"$i"比app=$(printf '%05d'"$i")效率高得多,因为前者发生时没有fork()中断shell的子进程来运行命令替换。(是的,这意味着您需要单独执行附加…但考虑到我们谈论的开销,这是值得的)。
- @查尔斯:所有图像都在/home/behzad/desktop/test/中。我想要一个文本文件,每行如下:/home/behzad/desktop/test/00000.bmp,/home/behzad/desktop/test/00001.bmp,…/home/behzad/desktop‌&8203;/test/00011.bmp
将~/foo/bar和子目录中所有.bmp文件的完整路径名打印到新的输出文件test2.txt中:
1 2
| s=~/foo/bar # full path of dir to be searched.
find"$s" -iname"*.bmp" -type f -fprint test2.txt |
从不同的目录向test2.txt添加更多的名称:
1 2
| s=~/oof/rab # full path of dir to be searched.
find"$s" -iname"*.bmp" -type f >> test2.txt |
- 不过,我认为这并不是运营商想要做的。注意他们是如何创建计数器并使用它来格式化新名称的。
- @查尔斯达菲,那很可能是真的。考虑到操作代码的质量,我的推论是操作可能有些混乱。
- 毫无疑问,他们很困惑,但是printf '%05d'并不是从任何地方冒出来的,存储在$i中的计数器也不是从任何地方冒出来的。同样,在他们唯一的评论中也可以看到5位数的数字,从而对所需的输出有任何了解。
我使用了下面的代码并完成了:)
1 2 3 4 5 6 7 8 9 10
| #!/bin/bash
i=0
find -type f -iname"*.bmp" | while read x; do
echo $(cd $(dirname"$1") && pwd -P)/$(basename"$1") >>test1.txt
app=$( printf"%05d" ${i}).bmp
echo $app >>test2.txt
i=$((i+1))
done
paste -d"" test1.txt test2.txt > path.txt |
- 循环使用文件名设置$X,但从不使用$X。test1.txt是一个重复$1的完整路径的列表;test2.txt是一个00001.bmp,…N.BMP)。然后将test1.txt和test2.txt粘贴在一起,创建path.txt——这些文件名可能不存在(也可能存在),但当前目录下的.bmp文件的数量是相同的。这让我觉得自己像60年代情景喜剧中的驾驶教练。