如何移动除一个文件之外的所有文件?我需要像这样的东西:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
我想把旧的东西移到新的文件夹中,除了Tux.png
以外。!符号表示否定。有没有什么工具可以完成这项工作?
如果您使用bash并且已经设置了extglob
shell选项(通常情况下是这样):
mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
shopt -s extglob
这扩展了正则表达式。 然后,您可以移动除一个文件以外的所有文件。
mv !(fileOne) ~/path/newFolder
请注意,在复制目录时,正斜杠不能在名称中使用,这一点在Why extglob except breaking except condition?线程中已经提到:
cp -r !(Backups.backupdb) /home/masi/Documents/
所以在否定语前使用Backups.backupdb/
是错误的,因为在移动目录时它存在被误用于其他命令以及可能会出现其他异常情况的风险。
mv !(arc*) archive_190629b
- TonyGfind ~/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 \;
find
命令应该成为在 Linux 上的日常必备命令,然后我的 find
命令行就几乎像自然语言一样易读。 - Johannes Schaub - litb我认为最简单的方法是使用反引号
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 Roagrep -v
吗? - Léo Léopold Hertz 준영一个快速的方法是修改tux文件名,这样你的移动命令就不会匹配。
例如:
mv Tux.png .Tux.png
mv * ~/somefolder
mv .Tux.png Tux.png
我认为这样更加安全和方便,可以依赖于简单的动作排除特定的文件或目录。
ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
ls
命令的 -l
选项会在命令行中包含大量无关信息,并导致 mv
命令失败。 - jdhaomv $(ls ~/folder | grep -v ~/folder/exclude.png) ~/destination
请注意,上面的命令中包含HTML标签,请保留。-v
表示 --invert-match
。我认为对于多个术语,可能可以使用 grep -e
,但我还没有弄清楚如何使用。 - cardamom[abc]*
以 a、b 或 c 开头的所有文件都可以通过在首位插入 "^" 字符来否定匹配。
[^abc]*
我有时会用这个来不匹配"lost+found"目录,例如:
mv /mnt/usbdisk/[^l]* /home/user/stuff/.
mv $(echo * | sed s:Tux.png::g) ~/Linux/New/
但是你必须进入该文件夹。
shopt
命令(它将会返回"command not found"错误),而是把下面这行代码添加到你的.zshrc
文件中:setopt extended_glob
然后, glob语法也会相应地改变。因此,使用mv ~/path/to/source^(exception) ~/path/to/target/folder
就可以了。 - Alex Xiong