如何从(bash) shell目录列表中只列出一个文件



有点低级的查询,但这里是: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'

相关内容

  • 没有找到相关文章

最新更新