检查给定类型的文件是否存在于 bash shell
Check if files of a given type exist in bash shell
我想在我的 Mac 中使用 Automator 和 shell 来整理我的文件。我试着写一些这样的命令:
mv -f /Users/myname/Downloads/*.zip /Users/myname/Downloads/zip/
mv -f /Users/myname/Downloads/*.txt /Users/myname/Downloads/txt/
他们成功了。但是我发现如果没有文件匹配,'mv'会return错误,所以我想做这样的事情。
if (txt file) , mv *.txt /txt/
if (zip file) , mv *.txt /zip/
我发现if语句正在使用
[ -f " "]
然后我写了这样的东西
[ -f "/Users/myname/Downloads/*.zip" ] && mv -f /Users/myname/Downloads/*.zip /Users/myname/Downloads/zip/ || echo 'Nothing'
但它 returns "Nothing" 即使文件存在。
我该如何解决这个问题?或者我不应该使用 shell 命令来执行此操作?
有什么建议吗?
使用 find
怎么样?像这样:
如果可以使用mv -t
find /Users/myname/Downloads/ -maxdepth 1 -name "*.zip" -print0 | xargs -0 mv -f -t /Users/myname/Downloads/zip/
如果你不走运(或使用-exec
,正如几条评论中指出的那样):
find /Users/myname/Downloads/ -maxdepth 1 -name "*.zip" -print0 | xargs -I {} -0 mv -f {} /Users/myname/Downloads/zip/
编辑 添加了 -print0
以使解决方案白色 space 安全。
EDIT2 使用 mv -t
而不是 {}
我想在我的 Mac 中使用 Automator 和 shell 来整理我的文件。我试着写一些这样的命令:
mv -f /Users/myname/Downloads/*.zip /Users/myname/Downloads/zip/
mv -f /Users/myname/Downloads/*.txt /Users/myname/Downloads/txt/
他们成功了。但是我发现如果没有文件匹配,'mv'会return错误,所以我想做这样的事情。
if (txt file) , mv *.txt /txt/
if (zip file) , mv *.txt /zip/
我发现if语句正在使用
[ -f " "]
然后我写了这样的东西
[ -f "/Users/myname/Downloads/*.zip" ] && mv -f /Users/myname/Downloads/*.zip /Users/myname/Downloads/zip/ || echo 'Nothing'
但它 returns "Nothing" 即使文件存在。
我该如何解决这个问题?或者我不应该使用 shell 命令来执行此操作? 有什么建议吗?
使用 find
怎么样?像这样:
如果可以使用mv -t
find /Users/myname/Downloads/ -maxdepth 1 -name "*.zip" -print0 | xargs -0 mv -f -t /Users/myname/Downloads/zip/
如果你不走运(或使用-exec
,正如几条评论中指出的那样):
find /Users/myname/Downloads/ -maxdepth 1 -name "*.zip" -print0 | xargs -I {} -0 mv -f {} /Users/myname/Downloads/zip/
编辑 添加了 -print0
以使解决方案白色 space 安全。
EDIT2 使用 mv -t
而不是 {}