我认为这可能是一个非常严重的问题,但我只是想问一下。 我跑的时候:
$ find . -maxdepth 1 -type f \( -name "*.mp3" -o -name "*.ogg" \)
并获得:
./01.Adagio - Allegro Vivace.mp3
./03.Allegro Vivace.mp3
./02.Adagio.mp3
./04.Allegro Ma Non Troppo.mp3
为什么找到文件名前加./
?我在脚本中使用它:
fList=()
while read -r -d $'\0'; do
fList+=("$REPLY")
done < <(find . -type f \( -name "*.mp3" -o -name "*.ogg" \) -print0)
fConv "$fList" "$dBaseN"
我必须在函数'fConv'的for
循环开头使用一些hacky-sed-fix,访问数组元素,删除前导./
。是否有一个find
选项会首先忽略前导./
?
答案 0 :(得分:3)
文件开头的./是路径。 “。”表示当前目录。
您可以使用“sed”删除它。
find . -maxdepth 1 -type f \( -name "*.mp3" -o -name "*.ogg" \) | sed 's|./||'
我不建议这样做,因为find
可以搜索多个目录,你怎么知道找到的文件是否位于当前目录中?
答案 1 :(得分:2)
find . -maxdepth 1 -type f \( -name "*.mp3" -o -name "*.ogg" \) -exec basename "{}" \;
话虽如此,我认为你可以使用更简单的方法:
for file in *.mp3 *.ogg
do
if [[ -f $file ]]; then
# Use the file
fi
done
答案 2 :(得分:2)
如果您要求它在/tmp
下搜索,则结果将显示在/tmp/file
表单上:
$ find /tmp
/tmp
/tmp/.X0-lock
/tmp/.com.google.Chrome.cUkZfY
如果您要求它在.
下搜索(与您一样),则结果将显示在./file
表单上:
$ find .
.
./Documents
./.xmodmap
如果您要求它搜索foo.mp3
和bar.ogg
,则结果将显示在foo.mp3
和bar.ogg
表单上:
$ find *.mp3 *.ogg
click.ogg
slide.ogg
splat.ogg
但是,这只是默认值。使用GNU和其他现代find
,您可以修改如何打印结果。要始终只打印最后一个元素:
find /foo -printf '%f\0'
如果结果为/foo/bar/baz.mp3
,则会产生baz.mp3
。
要打印相对于找到它的参数的路径,您可以使用:
find /foo -printf '%P\0'
对于/foo/bar/baz.mp3
,这会显示bar/baz.mp3
。
但是,您根本不应该使用find
。正如R Sahu所建议的那样,这是普通球的工作。
shopt -s nullglob
files=(*.mp3 *.ogg)
echo "Converting ${files[*]}:"
fConv "${files[@]}"
答案 3 :(得分:1)
如果您的-maxdepth
为1
,则只需使用ls
:
$ ls *.mp3 *.ogg
当然,这将会选择带有*.mp3
或*.ogg
后缀的任何目录,但您可能还没有这样的目录。
另一种方法是摧毁你的结果:
$ find . -maxdepth 1 -type f \( -name "*.mp3" -o -name "*.ogg" \) | sed 's#^\./##'
这将删除所有./
前缀,但不会触及其他文件名。请注意替换命令中的^
锚点。