mv 抱怨使用 grep 过滤文件名的管道中的标准输入

mv 抱怨使用 grep 过滤文件名的管道中的标准输入

我正在尝试将几个带有空格的 .avi 文件从 CD 移动到我的主文件夹中。我已经知道如何去掉空格:

find /media/mathscd/ | grep -L -r "*.avi" | for file in *; do mv "$file" echo $file | tr ' ' '_' ; done

但我正在努力寻找已编辑的文件并将它们一起移动到文件夹中。我不断收到错误消息mv: cannot stat '(standard input)': No such file or directory。这是我尝试使用的代码:

find /media/mathscd/ | grep -L -r  "*.avi" | xargs -I{} mv {} /home/09murphyt/Downloads/

有人可以告诉我我做错了什么吗?

答案1

你的问题是-L切换到grep.从手册页:

L, --files-without-match
禁止正常输出;相反,打印每个通常不会打印输出的输入文件的名称。扫描将在第一个匹配处停止。

所以而不是列出文件名不匹配的avi仅列出地方哪里grep没找到avi。由于grep通常在文件中查找,因此这样的开关将列出avi其中不包含模式的文件名。然而,在您的情况下,由于您正在通过管道传输到grepfrom find,因此正在读取的文件grep(standard input).要明白我的意思,请尝试:

find /media/mathscd | grep -L "*.avi"

结果:

(standard input)

换句话说,grep发现行"*.avi"与标准输入不匹配,这正是发生的情况。

由于find直接列出文件名,因此只需反转匹配的含义:

find /media/mathscd | grep -v ".*\.avi"

(请注意,grep模式与 shell 通配符不同;您也不需要开关-r

另外,find单独使用:

find /media/mathscd ! -name "*.avi"

答案2

尝试以下其中一项:

find /media/mathscd/ -name *.avi -exec mv -t ~/Downloads/ {} +
find /media/mathscd/ -name *.avi -print0 | xargs -0 mv -t ~/Downloads/

确保首先替换为进行xargs mv*测试xargs ls

相关内容