移动除一个文件之外的所有文件
- 2024-11-06 08:34:00
- admin 原创
- 29
问题描述:
如何移动除一个文件之外的所有文件?我正在寻找类似以下内容的内容:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
我将旧东西移到新东西文件夹,但Tux.png
!- 符号除外。有没有什么工具可以完成这项工作?
解决方案 1:
如果您使用 bash 并且extglob
设置了 shell 选项(通常是这种情况):
mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
解决方案 2:
将以下内容放入你的 .bashrc 中
shopt -s extglob
它扩展了正则表达式。然后,您可以通过以下方式移动除一个文件之外的所有文件:
mv !(fileOne) ~/path/newFolder
与其他命令相关的例外情况
请注意,在复制目录时,名称中不能使用 forward-flash,如线程Why extglob except breaking except condition?中所注意到的:
cp -r !(Backups.backupdb) /home/masi/Documents/
所以Backups.backupdb/
在否定之前这里是错误的,并且我不会在移动目录中使用它,因为存在错误使用然后与其他命令混淆以及可能的其他异常的风险。
解决方案 3:
我会采用传统的 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 \n -exec mv '{}' ~/Linux/New ;
解决方案 4:
一种快捷方式是修改 tux 文件名,这样您的移动命令就不会匹配。
例如:
mv Tux.png .Tux.png
mv * ~/somefolder
mv .Tux.png Tux.png
解决方案 5:
我认为最简单的方法是使用反引号
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
解决方案 6:
对于 bash,答案是正确的。以下是zsh(我选择的 shell)语法:
mv ~/Linux/Old/^Tux.png ~/Linux/New/
需要EXTENDED_GLOB
设置 shell 选项。
解决方案 7:
我发现这对于排除某些文件或目录的简单移动来说更安全,也更容易依赖。
ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
解决方案 8:
这可能更简单且容易记住,并且对我来说很有用。
mv $(ls ~/folder | grep -v ~/folder/exclude.png) ~/destination
解决方案 9:
以下方法并非 100% 保证,完全不应尝试用于脚本编写。但有时它足以快速用于交互式 shell。类似 file file glob 的
[abc]*
(将匹配所有以 a、b 或 c 开头的文件)可以通过先插入“^”字符来否定,即
[^abc]*
我有时会使用它来不匹配“lost+found”目录,例如:
mv /mnt/usbdisk/[^l]* /home/user/stuff/.
当然,如果还有其他以 l 开头的文件,我必须随后处理它们。
解决方案 10:
怎么样:
mv $(echo * | sed s:Tux.png::g) ~/Linux/New/
但您必须在文件夹中。
解决方案 11:
不用这样做也可以grep
:
ls ~/Linux/Old/ -QI Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/
注意:-I
是大写的 i,使ls
命令忽略之后列出的 Tux.png 文件。
然后将的输出ls
通过管道传输到mv
via中xargs
,这允许使用 ls 的输出作为 mv 的源参数。
ls -Q
仅引用 ls 列出的文件名。
解决方案 12:
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New
find 命令列出所有常规文件,而 fgrep 命令会过滤掉所有 Tux.png。反引号告诉 mv 移动结果文件列表。
解决方案 13:
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'
解决方案 14:
将所有文件(不包括除文件之外)移动到 except_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
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件