Bash 查找选项可用于省略前导'/';结果

Bash 查找选项可用于省略前导'/';结果,bash,find,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 为什么find在文件名前面加了一个/?我在脚本中使用了这一点: fList=(

我想这可能是一个很难回答的问题,但我只是想问一下。 当我跑步时:

$ 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 
为什么find在文件名前面加了一个
/
?我在脚本中使用了这一点:

fList=()
while read -r -d $'\0'; do
    fList+=("$REPLY")
done < <(find . -type f \( -name "*.mp3" -o -name "*.ogg" \) -print0)
fConv "$fList" "$dBaseN"
fList=()
而读取-r-d$'\0';做
fList+=(“$REPLY”)

完成<文件开头的./是路径。“.”表示当前目录

您可以使用“sed”将其删除

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

但是我不建议这样做,因为
find
可以搜索多个目录,您如何知道找到的文件是否位于当前目录中?

文件开头的./是路径。“.”表示当前目录

find . -maxdepth 1 -type f \( -name "*.mp3" -o -name "*.ogg" \) -exec basename "{}" \;
您可以使用“sed”将其删除

find . -maxdepth 1 -type f \( -name "*.mp3" -o -name "*.ogg" \) | sed 's|./||'
但是我不建议这样做,因为
find
可以搜索多个目录,您如何知道找到的文件是否位于当前目录中

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
话虽如此,我认为您可以使用更简单的方法:

for file in *.mp3 *.ogg
do
   if [[ -f $file ]]; then
       # Use the file
   fi
done

如果您要求它在
/tmp
下搜索,结果将显示在
/tmp/file
表格上:

$ find /tmp
/tmp
/tmp/.X0-lock
/tmp/.com.google.Chrome.cUkZfY
$ find .
.
./Documents
./.xmodmap

如果您要求它在
下搜索(与您一样),结果将显示在
/file
表格上:

$ find /tmp
/tmp
/tmp/.X0-lock
/tmp/.com.google.Chrome.cUkZfY
$ find .
.
./Documents
./.xmodmap
如果您要求它搜索
foo.mp3
bar.ogg
,结果将显示在
foo.mp3
bar.ogg
表格上:

$ find *.mp3 *.ogg
click.ogg
slide.ogg
splat.ogg
但是,这只是默认设置。使用GNU和其他现代
find
s,您可以修改打印结果的方式。要始终仅打印最后一个元素,请执行以下操作:

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[@]}"

如果您要求它在
/tmp
下搜索,结果将显示在
/tmp/file
表格上:

$ find /tmp
/tmp
/tmp/.X0-lock
/tmp/.com.google.Chrome.cUkZfY
$ find .
.
./Documents
./.xmodmap

如果您要求它在
下搜索(与您一样),结果将显示在
/file
表格上:

$ find /tmp
/tmp
/tmp/.X0-lock
/tmp/.com.google.Chrome.cUkZfY
$ find .
.
./Documents
./.xmodmap
如果您要求它搜索
foo.mp3
bar.ogg
,结果将显示在
foo.mp3
bar.ogg
表格上:

$ find *.mp3 *.ogg
click.ogg
slide.ogg
splat.ogg
但是,这只是默认设置。使用GNU和其他现代
find
s,您可以修改打印结果的方式。要始终仅打印最后一个元素,请执行以下操作:

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[@]}"

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

$ ls *.mp3 *.ogg
当然,这将拾取任何带有
*.mp3
*.ogg
后缀的目录,但您可能根本没有这样的目录

另一个是咀嚼你的结果:

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

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

如果您的
-maxdepth
1
,您只需使用
ls

$ ls *.mp3 *.ogg
当然,这将拾取任何带有
*.mp3
*.ogg
后缀的目录,但您可能根本没有这样的目录

另一个是咀嚼你的结果:

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

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

之所以加上前缀,是因为您可以在多个目录上运行
find
,因此输出需要明确<代码>查找。
可以是
查找。路径
,然后如果输出没有显示,您如何知道路径中有哪些匹配项?将查找结果输送到
sed
对我来说更有意义,因为编辑在输出旁边比在另一个代码块的开头更容易理解。我只想搜索$PWD,这就是为什么我指定了
-maxdepth 1
,所以在这个例子中,结果是预先设置的并不重要。预先设置的原因是您可以在多个目录上运行
find
,所以输出需要明确<代码>查找。可以是
查找。路径
,然后如果输出没有显示,您如何知道路径中有哪些匹配项?将查找结果输送到
sed
对我来说更有意义,因为编辑在输出旁边比在另一个代码块的开头更容易理解。我只想搜索$PWD,这就是为什么我指定了
-maxdepth 1
,所以在这个例子中,结果是预先准备好的并不重要。很好,
shopt-s nullglob
消除了检查文件是否存在的条件测试的需要。我从来没有用过,其实我什么都不知道,所以没有用过
shopt
s。Slick.nice,shopt-s nullglob不再需要条件测试来检查文件是否存在。我从来没有用过,其实我什么都不知道,所以没有用过
shopt
s。你说的好笑:实际上,脚本确实创建了一个目录,将转换后的文件转储到其中,父目录名附加了“_128kmp3”。但是仍然不应该匹配,因为它不是“_128k.mp3”,你说的很有趣:实际上脚本确实创建了一个目录,将转换后的文件转储到其中,并且父目录名附加了“_128kmp3”。但仍然不应该匹配,因为它不是“_128k.mp3”