对于大学我正在写一个脚本来读取和显示mp3文件中的id3标签。参数将是文件,即
./id3.sh file1.mp3 file2.mp3 morefiles.mp3
我可以使用$0, $1
等来阅读参数,并获得$#
的参数数量。如何让它读取ls命令的输出?
ls *.mp3 | ./id3.sh
答案 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