我想在包含至少一个但可能更多的.mp3文件的任何子目录中创建一个文件(包含目录名称)。我想创建一个文件,无论该目录中是否有一个或多个.mp3,并且dir可以有空格..我尝试过这样的事情:for i in $(find . -name "*.mp3" -printf "%h\n"|sort -u); do echo "$i" ; done
这会将路径分成两行,其中空格是这样的:
./directory one
输出为:
./directory
one
答案 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
find
&#39; printf
现在将文件名与NUL
分开。sort
,通过-z
选项,将元素拆分为NUL
s而不是换行符。IFS=
完全停止了分裂通用空格的shell习惯。read
选项-d
(这是 bashism )表示输入在特定字符上拆分(默认情况下为换行符)。 -d ''
bash认为指定NUL
,其中BroSlow有$'\0'
bash通过参数扩展规则扩展到''
,但可能更清楚可以看到对NUL
字符的明确引用。我喜欢和#34结束;谢谢你,BroSlow&#34;。