有点低级的查询,但这里是:Bash shell脚本。POSIX, Mint 21
我只想要一个/任何(mp3)文件从一个目录。作为样本。在正常执行中,一个完整的运行,代码将是这样的
for f in *.mp3 do
#statements
done
这工作得很好,但如果我想采样这样的数组/glob(?)的一个文件没有循环,我该怎么做?我不关心是哪个文件,只要它是我正在工作的目录中的mp3即可。我应该只是开始这个for循环,然后在一个语句后退出(break),还是有一个更整洁的方式,更适合工作的方式?
for f in *.mp3 do
#statement
break
done
Ta(真不敢相信我问这个问题有多笨,当我看到答案时我的额头会疼)
由于您使用的是Linux (Mint),因此您有GNUfind
,因此从当前目录获取.mp3
文件的一种方法是:
mp3file=$(find . -maxdepth 1 -mindepth 1 -name '*.mp3' -printf '%f' -quit)
-maxdepth 1 -mindepth 1
将搜索限制在当前目录下的一个级别。-printf '%f'
只打印文件名(例如foo.mp3
)。-print
选项将打印文件名的路径(例如./foo.mp3
)。这对你来说可能无关紧要。-quit
使find
在找到一个匹配项并打印后立即退出。
另一个选择是使用Bash:(冒号)命令和$_(美元下划线)特殊变量:
: *.mp3
mp3file=$_
: *.mp3
使用当前目录下的.mp3
文件列表作为参数运行:
命令。:
命令忽略它的参数,什么也不做。mp3file=$_
将mp3file
变量的值设置为上一个命令(:
)的最后一个参数。
如果.mp3
文件的数量很大(数百或更多),则不应使用第二个选项,因为它将查找所有文件并在内部按名称对它们进行排序。
在这两种情况下,$mp3file
都应该检查以确保它确实存在(例如[[ -e $mp3file ]]
),然后再将其用于其他任何事情,以防目录中没有.mp3
文件。
我会在POSIX shell中这样做:
mp3file=
for f in *.mp3; do
if [ -f "$f" ]; then
mp3file=$f
break
fi
done
# At this point, the variable mp3file contains a filename which
# represents a regular file (or a symbolic link) with the .mp3
# extension, or empty string if there is no such a file.
使用
for f in *.mp3 do
给我的建议是,在文件名中没有太多奇怪的字符来命名mp3。
在这种情况下,如果你真的不在乎哪个MP3,你可以:
f=$(ls *.mp3|head)
statement
或者,如果您希望每次都使用不同的名称:
f=$(ls *.mp3|sort -R | tail -1)
注意:如果你的文件名变得更复杂(包括空格或其他特殊字符),这将不再工作。
假设您的文件名中没有空格,(我不明白为什么在脚本中根本不使用ls,而不是在文件名中没有空格,个人来说)然后:-
ls *.mp3 | tr ' ' 'n' | sed -n '1p'