如何移动除一个文件以外的所有文件?我正在寻找类似的东西:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
在哪里我将旧东西移到新的东西 - 文件夹除外Tux.png
.!-sign代表一种否定.这个工作有一些工具吗?
如果你使用bash并设置了extglob
shell选项(通常是这种情况):
mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
将以下内容放在.bashrc中
shopt -s extglob
它扩展了正则表达式.然后,您可以移动除一个以外的所有文件
mv !(fileOne) ~/path/newFolder
请注意,在复制目录中,正向闪存不能在名称中使用,因为线程中注意到为什么extglob除了条件以外都会破坏?:
cp -r !(Backups.backupdb) /home/masi/Documents/
所以Backups.backupdb/
在否定之前这里是错误的,我不会在移动目录中使用它,因为使用其他命令和其他可能的例外错误地使用globs的风险.
我会选择传统的find&xargs方式:
find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png -print0 | xargs -0 mv -t ~/Linux/New
-maxdepth 1
使它不是递归搜索.如果你只关心文件,你可以说-type f
.-mindepth 1
使它不包括~/Linux/Old
路径本身到结果中.适用于任何文件名,包括包含嵌入换行符的文件名.
一条评论指出,mv -t
选项可能是GNU扩展.对于没有它的系统
find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png \ -exec mv '{}' ~/Linux/New \;
一种快速方法是修改tux文件名,以便移动命令不匹配.
例如:
mv Tux.png .Tux.png mv * ~/somefolder mv .Tux.png Tux.png
我认为最简单的方法是使用反引号
mv `ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/
编辑:
使用反斜杠和ls代替,以防止使用别名,即大多数ls别名为ls --color.
mv `\ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/
谢谢@Arnold Roa
对于bash,回答是正确的.这是zsh(我选择的shell)语法:
mv ~/Linux/Old/^Tux.png ~/Linux/New/
需要EXTENDED_GLOB
设置shell选项.
我发现这对于排除某些文件或目录的简单移动来说更安全,更容易依赖.
ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
以下不是100%保证的方法,并且根本不应该尝试编写脚本.但有时它足以快速交互式shell使用.像文件文件一样的文件
[abc]*
(它将匹配名称以a,b或c开头的所有文件)可以通过首先插入"^"字符来否定,即
[^abc]*
我有时使用它来匹配"lost + found"目录,例如:
mv /mnt/usbdisk/[^l]* /home/user/stuff/.
当然,如果有其他文件以l开头,我必须在之后处理这些文件.