找到可用于省略前导' ./&#39的选项;结果

时间:2014-07-08 20:30:03

标签: bash find

我认为这可能是一个非常严重的问题,但我只是想问一下。 我跑的时候:

$ 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选项会首先忽略前导./

4 个答案:

答案 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.mp3bar.ogg,则结果将显示在foo.mp3bar.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)

如果您的-maxdepth1,则只需使用ls

$ ls *.mp3 *.ogg

当然,这将会选择带有*.mp3*.ogg后缀的任何目录,但您可能还没有这样的目录。

另一种方法是摧毁你的结果:

$ find . -maxdepth 1 -type f \( -name "*.mp3" -o -name "*.ogg" \) | sed 's#^\./##'

这将删除所有./前缀,但不会触及其他文件名。请注意替换命令中的^锚点。