bash脚本在dir中创建包含(多个)文件类型的文件

时间:2014-11-02 04:51:48

标签: bash find

我想在包含至少一个但可能更多的.mp3文件的任何子目录中创建一个文件(包含目录名称)。我想创建一个文件,无论该目录中是否有一个或多个.mp3,并且dir可以有空格..我尝试过这样的事情:for i in $(find . -name "*.mp3" -printf "%h\n"|sort -u); do echo "$i" ; done

这会将路径分成两行,其中空格是这样的:

./directory one

输出为:

./directory
one

1 个答案:

答案 0 :(得分:1)

中的构造$( ... )
for x in $(find ... | ... | ... ) ; do ... ; done

执行$( ... )中的任何内容并传递您在终端中看到的换行分隔输出,如果您已从shell提示符执行...命令到for构造由空格分隔的长名单,如

% ls -d1 b*
bianco nodi.pdf
bin
b.txt
% echo $(ls -d1 b*)
bianco nodi.pdf bin b.txt
% 

现在,for周期将i分配给列表中的第一项,在我的示例bianco中,当然它不是您想要的...... < / p>

这种情况是用这个习惯用来处理的,其中shell一次读取一个整行

% ls -d1 b* | while read i ; do echo "$i" ; ... ; done

在你的情况下

find . -name "*.mp3" -printf "%h\n" | sort -u | while read i ; do
       echo "$i"
done

hth,ciao


修改

上面我的anser捕获了 文件名中最常见的空白 ,但如果文件名的开头或结尾有空白,它仍然会失败如果文件名中嵌入了换行符,也会失败。

因此,根据BroSlow的建议,我会修改我的答案(见下面的评论)。

find . -name "*.mp3" -printf "%h\0" | \
sort -uz | while IFS= read -r -d '' i ; do
     ...
done

要点

  1. find&#39; printf现在将文件名与NUL分开。
  2. sort,通过-z选项,将元素拆分为NUL s而不是换行符。
  3. IFS=完全停止了分裂通用空格的shell习惯。
  4. read选项-d(这是 bashism )表示输入在特定字符上拆分(默认情况下为换行符)。
    在这里,我有-d '' bash认为指定NUL,其中BroSlow有$'\0' bash通过参数扩展规则扩展到'',但可能更清楚可以看到对NUL字符的明确引用。
  5. 我喜欢和#34结束;谢谢你,BroSlow&#34;。