在 ZSH 中,如何将当前目录中除两个或更多文件之外的所有文件移动(mv)到子目录中?

在 ZSH 中,如何将当前目录中除两个或更多文件之外的所有文件移动(mv)到子目录中?

(bash 上有很多关于此问题的信息,但 zsh 上的信息少得多,而且对于两个或更多文件则根本没有信息。不知道如何将^(“插入符号”)应用于多个文件)。

我想知道(见下面的文件),如何将mv所有文件移动到/test-folder,除了两个文件:a1a2
我没有找到任何明确的语法(除了 bash [看起来用!(a1|a2),会很容易])来对两个或更多文件执行此操作。

相当于.zsh看起来!是(“插入符号”)。我可以用一个取得一些成功,但我找不到将应用于两个或更多的^方法。^

  • 我发现了很多与 bash shell 相关的内容:(shopt -s extglob例如mv !(fileOne) ~/path/newFolder:)
  • 我发现与 zsh shell 相关的较少:(setopt extendedglob例如mv A/^(file|directory)(|2)(D) B/:)
  • 还有其他带有find ... -exec ...和其他带有 的方法xargs,其作者表示为“经典方法”)。

将所有文件移动到/test-folder,除a1和 之外a2

~/linux_experiments/MV_CP_ETC$ ls -lrt
total 4
-rw-r--r-- 1 kali kali    0 Mar 24 15:45 a1
-rw-r--r-- 1 kali kali    0 Mar 24 15:45 a2
-rw-r--r-- 1 kali kali    0 Mar 24 15:45 a3
-rw-r--r-- 1 kali kali    0 Mar 24 15:45 a4
-rw-r--r-- 1 kali kali    0 Mar 24 15:45 a5
drwxr-xr-x 2 kali kali 4096 Mar 24 16:17 test-folder

这是我能走的全部距离:

$ ls
a1  a2  a3  a4  a5  test-folder
                                                                             
$ mv ./^a1 test-folder 
mv: cannot move './test-folder' to a subdirectory of itself, 'test-folder/test-folder'
                                                                             
$ ls -lrt
total 4
-rw-r--r-- 1 kali kali    0 Mar 24 15:45 a1
drwxr-xr-x 2 kali kali 4096 Mar 24 15:56 test-folder
                                                                             
$ cd test-folder
                                                                             
$ ls     
a2  a3  a4  a5

答案1

您可以使用“非”运算符:

setopt extendedglob
mv ^a[12] testfolder
mv ^a<1-2> testfolder
mv ^(a1|a2) testfolder

或者,也可以使用“但非”运算符:

setopt extendedglob
mv *~a[12] testfolder
mv *~a<1-2> testfolder
mv *~(a1|a2) testfolder

<x-y>匹配 x 和 y 之间的任意数字(含)。)

https://zsh.sourceforge.io/Doc/Release/Expansion.html#Filename-Generation

有趣的事实:将它们组合起来~^会得到一个“与”运算符。:)

相关内容