2017-07-21 54 views
0

所以, 我在文件夹名称中括号用空格:文件夹名称以括号在bash变量

文件夹\文件夹(2000)\ file.srt

文件夹\文件夹(1990)\ file.srt

for file in `find . -name "*.srt"` 
do 
echo "file = $file"; 
done 

不要在我的脚本中工作。任何人都可以帮助我?

+0

不要为我工作。 [看这里](https://gist.github.com/oe1tkt/e9182b32382f78a41c1a)我使用这个脚本,但在我的结构中不起作用,因为这个()在文件夹名称。 – LetterLin

回答

0

您可以使用此find -exec

find . -name "*.srt" -exec echo "file = {}" \; 

输出:

file = ./folder/folder (1990)/file.srt 
file = ./folder/folder (2000)/file.srt 
+0

不要在这里工作,需要循环。我仅以回声为例。我的脚本使用iconv。现在感谢。 – LetterLin

+0

[看这里](https://gist.github.com/oe1tkt/e9182b32382f78a41c1a)我正在使用这个脚本,但在我的结构中不起作用,因为这()在文件夹名称。 – LetterLin

+0

@LetterLin我认为问题实际上是空间。试试这个: 'files = $(find。-name'* .srt')' 'while read f;做echo“file:$ f”;完成<<< $ files' – Tom

0

的问题是,在由find(1)产生的文件名的空间越来越穿插成\n S离开的名字,并且for命令可以在不区分它们的情况下获取它们。

最好的方法(和一个保存命令)是使用find(1)-print0选项,打印由一个空字符分离的文件名,然后使用xargs命令与-0选项,这预计空值作为分隔符。通过这种方式,您可以使用系统可承受的参数来执行命令。例如

find . -type f -name "* *" -print0 | xargs -0 cat 

将打印所有文件的名称中有空格的内容。

在您的示例中,您希望对每条数据线执行一些脚本,因此更好的方法是使用read shell命令,因为(在这种情况下,您不需要-print0选项,因为文件由换行符分隔,所以你会阅读每读取文件)

find . -name "*.srt" | while read file 
do 
    echo "file = ${file}" 
done 

但在这种情况下,你会不会得到有效xargs(1)使用,把尽可能多的参数在被调用命令的命令行可能。您将一次处理每个文件一个文件。

相关问题