【发布时间】:2010-10-14 19:15:54
【问题描述】:
如何移动除一个以外的所有文件?我正在寻找类似的东西:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
我将旧内容移至新内容文件夹,Tux.png 除外。 !-符号表示否定。有适合这项工作的工具吗?
【问题讨论】:
如何移动除一个以外的所有文件?我正在寻找类似的东西:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
我将旧内容移至新内容文件夹,Tux.png 除外。 !-符号表示否定。有适合这项工作的工具吗?
【问题讨论】:
一种快速的方法是修改 tux 文件名,以便您的移动命令不匹配。
例如:
mv Tux.png .Tux.png
mv * ~/somefolder
mv .Tux.png Tux.png
【讨论】:
如果您使用 bash 并设置了 extglob shell 选项(通常是这种情况):
mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
【讨论】:
shopt(这将给出command not found 错误),将其添加到您的.zshrc:setopt extended_glob 然后syntax for glob 也会相应地更改。因此使用mv ~/path/to/source^(exception) ~/path/to/target/folder 应该这样做
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New
find 命令列出所有常规文件,fgrep 命令过滤掉所有 Tux.png。反引号告诉 mv 移动生成的文件列表。
【讨论】:
对于 bash,sth answer 是正确的。这是zsh(我选择的shell)语法:
mv ~/Linux/Old/^Tux.png ~/Linux/New/
需要设置EXTENDED_GLOB shell 选项。
【讨论】:
我会采用传统的 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 \;
【讨论】:
以下不是 100% 保证的方法,根本不应该尝试编写脚本。但有时它对于快速交互式 shell 使用来说已经足够了。一个文件文件 glob 像
[abc]*
(将匹配名称以 a、b 或 c 开头的所有文件)可以通过先插入“^”字符来否定,即
[^abc]*
我有时用它来匹配“lost+found”目录,例如:
mv /mnt/usbdisk/[^l]* /home/user/stuff/.
当然,如果还有其他以 l 开头的文件,我必须在之后处理这些文件。
【讨论】:
将以下内容放入您的 .bashrc
shopt -s extglob
它扩展了正则表达式。 然后,您可以移动除一个以外的所有文件
mv !(fileOne) ~/path/newFolder
请注意,在复制目录时,不能在线程 Why extglob except breaking except condition? 中注意到的名称中使用 forward-flash:
cp -r !(Backups.backupdb) /home/masi/Documents/
所以Backups.backupdb/ 在否定之前在这里是错误的,我不会在移动目录中使用它,因为有可能错误地使用它然后将 glob 与其他命令和可能的其他异常一起使用。
【讨论】:
mv !(arc*) archive_190629b
对于排除某些文件或目录的简单移动,我发现它更安全,更容易依赖。
ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
【讨论】:
-l 选项到ls 将在命令行中包含很多不相关的信息并导致 mv 命令失败。
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'
【讨论】:
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 -v吗?
不用grep 也可以这样做:
ls ~/Linux/Old/ -QI Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/
注意:-I 是一个大写字母 i,使ls 命令忽略后面列出的 Tux.png 文件。
ls 的输出然后通过xargs 传送到mv,这允许使用 ls 的输出作为 mv 的源参数。
ls -Q 只是引用 ls 列出的文件名。
【讨论】:
怎么样:
mv $(echo * | sed s:Tux.png::g) ~/Linux/New/
你必须在文件夹中。
【讨论】:
这可能更简单易记,而且对我有用。
mv $(ls ~/folder | grep -v ~/folder/exclude.png) ~/destination
【讨论】:
将所有文件(不包括文件除外)移动到 except_filefind -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
【讨论】: