如何读取每个文件并在读取之前打印出文件名?

Chl*_*loe 2 linux bash shell

我试过

$ find Music -exec cp -v {} \>/dev/null \;
Run Code Online (Sandbox Code Playgroud)

有错误

'Music/AlbumArtSmall.jpg' -> '>/dev/null'
cp: cannot create regular file '>/dev/null': No such file or directory
Run Code Online (Sandbox Code Playgroud)

我试过

$ find Music -exec echo {} && echo cp {} \>/dev/null \;
find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)

$ find Music -exec echo {} \\; echo cp {} \>/dev/null \;
find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)

$ find Music -exec echo {} \&\& cp {} \>/dev/null \;
Music && cp Music >/dev/null
...
Run Code Online (Sandbox Code Playgroud)

我试过

$ find Music -exec bash -c 'echo "{}" && echo cp \"{}\" /dev/null' \;
Music/4-Mat - Intro Music.mp3
cp "Music/4-Mat - Intro Music.mp3" /dev/null
Run Code Online (Sandbox Code Playgroud)

看起来它会起作用,但它给了

$ find Music -exec bash -c 'echo "{}" && cp \"{}\" /dev/null' \;
Music/4-Mat - Intro Music.mp3
cp: target '/dev/null' is not a directory
Run Code Online (Sandbox Code Playgroud)

当我取出第二个“回声”时。

这是一个类似但不相同的问题:find with exec : how to perform multistep conditional action on each file

AFH*_*AFH 5

您似乎在没有得到正确组合的情况下四处走动:

find Music -exec cp -v {} /dev/null \;
Run Code Online (Sandbox Code Playgroud)

至少需要两个参数cp,源和一个目标,目标可以是文件或目录。当您转义时,>您正在删除其重定向属性,因此>/dev/null成为目标,在当前目录中查找子目录。

请注意,您不能使用该-exec选项指定单独的重定向:参数将直接传递给调度程序,而无需进一步的 shell 解释。

对于我自己,我通常更喜欢这个结构-exec

find Music | while read -r l; do cp -v "$l" /dev/null; done
Run Code Online (Sandbox Code Playgroud)

然后我可以在while子句中使用所有正常的 shell 命令,包括多个命令、重定向等。

请注意,文件名中的某些字符(例如嵌入的换行符或前导和尾随空格)将阻止此解决方案工作,而原始-exec答案应适用于所有文件名。我没有任何这样的文件名,因此我的偏好。