我正在尝试将几个带有空格的 .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
其中不包含模式的文件名。然而,在您的情况下,由于您正在通过管道传输到grep
from 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
。