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年代情景喜剧中的驾驶教练。