bash - 将ls重定向到自定义脚本

时间:2012-03-12 22:12:36

标签: linux bash shell io ls

对于大学我正在写一个脚本来读取和显示mp3文件中的id3标签。参数将是文件,即

./id3.sh file1.mp3 file2.mp3 morefiles.mp3

我可以使用$0, $1等来阅读参数,并获得$#的参数数量。如何让它读取ls命令的输出?

ls *.mp3 | ./id3.sh

5 个答案:

答案 0 :(得分:5)

试试这个:

ls *.mp3 | xargs id3.sh

答案 1 :(得分:3)

ls *.mp3 > ./id3.sh命令将用mp3列表覆盖你的id3.sh脚本。你可以试试这个:

./id3.sh `ls *.mp3`
编辑:实际上,我在想什么?有没有理由你不能这样做?

./id3.sh *.mp3

答案 2 :(得分:2)

我建议使用竖线和xargs -n 参数,在下面的示例中,将使用调用 id3.sh 脚本ls *.mp3列出的大多数10个文件。这非常重要,特别是如果您可以在列表中包含hounreds或数千个文件。如果省略-n 10,那么您的脚本将被称为整个列表。如果列表太长,您的系统可能会拒绝运行您的脚本。您可以尝试在脚本的每个调用中处理多少文件(例如,在您的情况下哪些文件更有效)。

ls *.mp3 | xargs -n 10 id3.sh

然后您可以像

一样阅读 id3.sh 脚本中的文件
while [ "$1" != "" ]; do
    #next file available in ${1}
    shift
done

答案 3 :(得分:1)

如果.mp3文件的数量太大,导致扩展的*.mp3超出了shell的限制,任何涉及*.mp3扩展的解决方案都会失败。上述解决方案都存在这个问题:

ls *.mp3 | ...
for file in *.mp3; do ...

事实上,尽管ls *.mp3|xargs ...是一个好的开始,但它有同样的问题,因为它需要shell扩展*.mp3列表并使用该列表作为{的命令行参数{1}}命令。

正确处理任意数量文件的一种方法是:

ls

OR:

find . -maxdepth 1 -iname '*.mp3'|while read f; do
    do_something_one_file_at_a_time.sh "$f"
done

(两种变体都有正确处理带有空格的文件名的附带好处,例如“Raindrops Keep Falling On My Head.mp3”。

请注意,在do_something.sh中,您需要执行find . -maxdepth 1 -iname '*.mp3' -print0|xargs -0 do_something.sh 而不仅仅是for file in "$@"; do ...for file in $*;do ...。 另请注意,如果文件名包含空格,则amit_g的解决方案会中断。)

答案 4 :(得分:-2)

./id3.sh *.mp3 # if the number of files is not too many

ls *.mp3 | xargs -n 10 ./id3.sh # if the number of files could be too many

然后在id3.sh

while [ "$1" != "" ]
do
    filename=$1

    #do whatever with $filename

    shift
done