![如何读取每个文件并在读取之前打印出文件名?](https://linux22.com/image/1543442/%E5%A6%82%E4%BD%95%E8%AF%BB%E5%8F%96%E6%AF%8F%E4%B8%AA%E6%96%87%E4%BB%B6%E5%B9%B6%E5%9C%A8%E8%AF%BB%E5%8F%96%E4%B9%8B%E5%89%8D%E6%89%93%E5%8D%B0%E5%87%BA%E6%96%87%E4%BB%B6%E5%90%8D%EF%BC%9F.png)
我试过
$ find Music -exec cp -v {} \>/dev/null \;
出现错误
'Music/AlbumArtSmall.jpg' -> '>/dev/null'
cp: cannot create regular file '>/dev/null': No such file or directory
我试过
$ find Music -exec echo {} && echo cp {} \>/dev/null \;
find: missing argument to `-exec'
和
$ find Music -exec echo {} \\; echo cp {} \>/dev/null \;
find: missing argument to `-exec'
和
$ find Music -exec echo {} \&\& cp {} \>/dev/null \;
Music && cp Music >/dev/null
...
我试过
$ 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
看起来似乎可以,但是它
$ find Music -exec bash -c 'echo "{}" && cp \"{}\" /dev/null' \;
Music/4-Mat - Intro Music.mp3
cp: target '/dev/null' is not a directory
当我把第二个‘回声’取出来时。
这是一个类似但不相同的问题:使用 exec 查找:如何对每个文件执行多步条件操作
答案1
你似乎走遍了所有的房屋却没有找到正确的组合:
find Music -exec cp -v {} /dev/null \;
至少需要两个参数cp
,即源和一个目标,目标可以是文件或目录。退出时,>
您将删除其重定向属性,因此>/dev/null
将成为目标,在当前目录中查找子目录。
请注意,您不能使用该选项指定单独的重定向-exec
:参数将直接传递给预定的程序,而无需进一步进行 shell 解释。
就我自己而言,我通常更喜欢这种结构-exec
:
find Music | while read -r l; do cp -v "$l" /dev/null; done
然后我可以使用该子句中的所有常规 shell 命令while
,包括多个命令、重定向等。
请注意,文件名中的某些字符(例如嵌入的新行或前导和尾随空格)将阻止此解决方案起作用,而原始-exec
答案应该适用于所有文件名。我没有这样的文件名,因此我更喜欢它。