移动除一个以外的所有文件
如何移动除一个以外的所有文件? 我正在寻找像这样的东西:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
在那里我把旧东西移动到除Tux.png
之外的新东西 – 文件Tux.png
。 ! – 表示否定。 有工作的工具吗?
如果使用bash并且设置了extglob
shell选项(通常是这种情况):
mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
把以下内容放到你的.bashrc中
shopt -s extglob
它扩展了正则expression式。 然后您可以移动除一个以外的所有文件
mv !(fileOne) ~/path/newFolder
与其他命令有关的例外
请注意,在复制目录中,正如在线程中注意到的那样,forward-flash不能用于名称为什么extglob除了破坏条件之外呢? :
cp -r !(Backups.backupdb) /home/masi/Documents/
所以Backups.backupdb/
在这个否定之前是错误的,我不会在移动目录中使用它,因为这样会有其他命令和其他可能的exception使用错误的风险。
我会用传统的find&xargs方式去:
find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png -print0 | xargs -0 mv -t ~/Linux/New
-maxdepth 1
使它不能recursionsearch。 如果你只关心文件,你可以说-type f
。 -mindepth 1
使得它不包含~/Linux/Old
path本身。 适用于任何文件名,包括那些包含embedded换行符的文件名。
一个评论指出,mv -t
选项可能是GNU扩展。 对于没有它的系统
find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png \ -exec mv '{}' ~/Linux/New \;
快速的方法是修改tux文件名,这样你的move命令就不会匹配。
例如:
mv Tux.png .Tux.png mv * ~/somefolder mv .Tux.png Tux.png
对于bash而言, 答案是正确的。 这里是zsh (我的shell的select)语法:
mv ~/Linux/Old/^Tux.png ~/Linux/New/
需要设置EXTENDED_GLOB
shell选项。
我觉得这样更安全,更容易依靠排除某些文件或目录的简单移动。
ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
我认为最简单的方法就是反引号
mv `ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/
编辑:
使用反斜杠,而不是使用别名,即大多数ls被别名为ls –color。
mv `\ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/
谢谢@Arnold Roa
以下是不是100%保证的方法,不应该尝试脚本。 但是有些时候对于快速的交互式shell使用来说已经足够了。 一个文件文件glob像
[abc]*
(将匹配所有名称以a,b或c开头的文件)可以通过先插入“^”字符来取消,即
[^abc]*
我有时使用这个不匹配“lost + found”目录,例如:
mv /mnt/usbdisk/[^l]* /home/user/stuff/.
当然,如果还有其他的文件以l开头,那么我必须处理这些文件。
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New
find命令列出所有常规文件,而fgrep命令会过滤掉任何Tux.png。 反引号告诉mv移动生成的文件列表。
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'
如何移动文件夹中的所有内容,然后将Tux.png移回?
我想不出任何shell语法来说“除了…之外的所有东西”。