如何在跳过一些文件和目录时集中移动文件

Oto*_*man 4 bash shell glob

我正在尝试编写一个shell脚本来移动所有文件,除了以.sh 和结尾的文件.py.我也不想移动目录.

这是我到目前为止所得到的:

cd FILES/user/folder
shopt -s extglob
mv !(*.sh|*.py) MoveFolder/ 2>/dev/null 
shopt -u extglob
Run Code Online (Sandbox Code Playgroud)

这将移动除包含.sh或的所有文件以外的所有文件.py,但所有目录也会移入MoveFolder.

我想我可以重命名文件夹,但是其他脚本已经为他们的工作分配了这些文件夹,因此重命名可能会给我带来更多麻烦.我也可以添加文件夹名称,但每当有人创建文件夹时,我都必须将其名称添加到脚本中,否则它也会被移动.

如何改进此脚本以跳过所有文件夹?

xhi*_*nne 5

使用find此:

find -maxdepth 1 \! -type d \! -name "*.py" \! -name "*.sh" -exec mv -t MoveFolder {} +
Run Code Online (Sandbox Code Playgroud)

它能做什么:

  • find:找东西......
  • -maxdepth 1:那是在当前目录中......
  • \! -type d:那不是目录......
  • \! -name "*.py:并且其名称不以.py... 结尾
  • \! -name "*.sh:并且其名称不以.sh... 结尾
  • -exec mv -t MoveFolder {} +:并将它们移动到目录 MoveFolder

-exec标志是特殊的:违背其为条件,事先标志,这个人是一个动作.对于每个匹配,+结束以下命令将指示find在命令结尾处聚集文件名,在标记为的位置{}.找到所有文件后,find执行生成的命令(即mv -t MoveFolder file1 file2 ... fileN).