我怎样才能移动所有的文件,除了一个? 我正在寻找类似:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
我把旧的东西移到新的文件夹,除了 Tux.png。!符号代表否定。有什么工具可以做这项工作吗?
Tux.png
一个快速的方法是修改 tux 文件名,使您的 move 命令不匹配。
例如:
mv Tux.png .Tux.png mv * ~/somefolder mv .Tux.png Tux.png
如果使用 bash 并设置了 extglob shell 选项(通常都是这种情况) :
extglob
mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New
Find 命令列出所有常规文件,fgrep 命令过滤掉任何 Tux.png。反勾告诉 mv 移动生成的文件列表。
对于 bash,某事物的答案是正确的。下面是 切(我选择的 shell)语法:
mv ~/Linux/Old/^Tux.png ~/Linux/New/
需要设置 EXTENDED_GLOB shell 选项。
EXTENDED_GLOB
我会用传统的 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路径本身到结果中。可用于任何文件名,包括那些包含嵌入换行符的文件名。
-maxdepth 1
-type f
-mindepth 1
~/Linux/Old
一条评论指出,mv -t选项可能是 GNU 扩展
-t
find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png \ -exec mv '{}' ~/Linux/New \;
以下方法不是100% 保证的方法,根本不应该尝试用于脚本。但有时对于快速交互式 shell 使用来说,它已经足够好了。类似于
[abc]*
(它将匹配名称以 a、 b 或 c 开头的所有文件)可以通过首先插入“ ^”字符来否定,即。
[^abc]*
我有时会用它来解决不匹配“ lost + found”目录的问题,比如:
mv /mnt/usbdisk/[^l]* /home/user/stuff/.
当然,如果有其他文件以 l 开头,我必须处理这些后面。
把下面的内容放到你的.bashrc
shopt -s extglob
它扩展了正则表达式。 然后,您可以移动所有文件,除了一个
mv !(fileOne) ~/path/newFolder
请注意,在复制目录时,正向闪存不能用在线程 除了条件外,为什么除了破坏以外的其他情况?中注意到的名称中:
cp -r !(Backups.backupdb) /home/masi/Documents/
因此 Backups.backupdb/在这里是错误的否定之前,我不会使用它也不会在移动目录,因为使用错误的风险,然后与其他命令和可能的其他异常球。
Backups.backupdb/
我发现对于排除某些文件或目录的简单移动来说,这样做更安全,也更容易依赖。
ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'
我认为最简单的方法是使用反勾
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
没有 grep也可以这样做:
grep
ls ~/Linux/Old/ -QI Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/
注意: -I是大写的 i,使得 ls命令忽略后面列出的 Tux.png 文件。
-I
ls
然后通过 xargs将 ls的输出通过管道传输到 mv,这允许使用 ls 的输出作为 mv 的源参数。
xargs
mv
ls -Q只引用 ls 列出的文件名。
ls -Q
这个怎么样:
mv $(echo * | sed s:Tux.png::g) ~/Linux/New/
但你必须在文件夹里。
这可能是更简单,容易记住,它为我工作。
mv $(ls ~/folder | grep -v ~/folder/exclude.png) ~/destination
将所有文件(不包括除了文件以外的文件)移动到除了 _ file find -maxdepth 1 -mindepth 1 -not -name except_file -print0 |xargs -0 mv -t ./except_file 例如(除文件外,缓存是当前的) find -maxdepth 1 -mindepth 1 -not -name cache -print0 |xargs -0 mv -t ./cache
find -maxdepth 1 -mindepth 1 -not -name except_file -print0 |xargs -0 mv -t ./except_file
find -maxdepth 1 -mindepth 1 -not -name cache -print0 |xargs -0 mv -t ./cache