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

时间:2017-01-07 19:23:46

标签: bash shell glob

我正在尝试编写一个移动所有文件的shell脚本,但以.pycd FILES/user/folder shopt -s extglob mv !(*.sh|*.py) MoveFolder/ 2>/dev/null shopt -u extglob 结尾的文件除外。我也不想移动目录。

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

.sh

这将移动除.pyMoveFolder之外的所有文件,但所有目录也会移至var message = { app_id: "xxxx", contents: {"en": messages}, include_player_ids: [token], small_icon: "resource_name", // can not be an url large_icon: "http://url/ or resource_name" }

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

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

2 个答案:

答案 0 :(得分:5)

使用find

find -maxdepth 1 \! -type d \! -name "*.py" \! -name "*.sh" -exec mv -t MoveFolder {} +

它的作用:

  • 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)。

答案 1 :(得分:1)

您必须检查每个元素以查看它是否是目录,以及它的扩展名:

for f in FILES/user/folder/*
do
   extension="${f##*.}"
   if [ ! -d "$f" ] && [[ ! "$extension" =~ ^(sh|py)$ ]]; then
       mv "$f" MoveFolder
   fi
done

否则,您也可以使用find -type f并使用maxdepth和正则表达式执行某些操作。

基于Check if a string matches a regex in Bash script的文件名的正则表达式,通过解决方案提取的扩展名为Extract filename and extension in Bash