如何创建多个目录并移动多个文件

如何创建多个目录并移动多个文件

例如,我有一个包含多个文件的目录,其通用格式如下:

dir1/identifier1_desiredName1.m
dir1/identifier1_desiredName2
dir1/identifier1_desiredName3.m
dir1/identifier2_desiredName1.m
dir1/identifier2_desiredName2.m
dir1/identifier3_desiredName1.m
dir1/identifier3_desiredName2.m
dir1/identifier3_desiredName3
dir1/identifier4_desiredName1.m
dir1/identifier4_desiredName2.m
dir1/jabberwocky-mimsy-borogoves
dir1/other--should-not-be-moved

我正在尝试编写一个脚本,通过使用该标识符创建一个目录来按标识符分隔文件,然后将具有相同标识符的文件移动到该目录中。

在搬家结束时,我想要这样的东西:

dir1/identifier1/desiredName1.m
dir1/identifier1/desiredName2
dir1/identifier1/desiredName3.m
dir1/identifier2/desiredName1.m
dir1/identifier2/desiredName2.m
dir1/identifier3/desiredName1.m
dir1/identifier3/desiredName2.m
dir1/identifier3/desiredName3
dir1/identifier4/desiredName1.m
dir1/identifier4/desiredName2.m
dir1/jabberwocky-mimsy-borogoves
dir1/other--should-not-be-moved

截至目前,我认为我在目录制作方面走在正确的轨道上:

awk _ {print $1} | uniq | mkdir

语法可能不太正确,但总体思路是打印出第一列,用 分隔_,省略重复,然后将这些名称通过管道传输到 中mkdir。但后来我对将文件移动到目录中感到不知所措。我正在考虑grep类似地使用(替换mkdir上面然后通过管道进入mv),但我不确定它是否有效。

答案1

ls > list例如,您可以在列表中列出您的文件,
然后使用它的循环读取来构建子文件夹,然后移动文件,将它们从其名称作为模式过滤器分派到好的文件夹中。

这里我用空文件做了一个测试 touch filename来演示方法

bash-4.4$ while read
> do
> if [ ! -d ${REPLY/_*/} ]; then
>    mkdir ${REPLY/_*/}
> fi
> done < list

bash-4.4$ #here directories are made then use similar method for moving files
bash-4.4$ while read; do  if [ -f $REPLY ] ; then mv $REPLY ${REPLY/_*/}/${REPLY/*_/} ; fi ;  done < list
bash-4.4$ tree
.
├── identifier
│   └── desiredName.m
├── identifier1
│   ├── desirename1.m
│   └── desirename.m
├── identifier2
│   └── desirename2.m
└── list

3 directories, 5 files
bash-4.4$ 5~

当然,您可以在 shell 中直接使用,也可以在脚本中使用类似的语法。

答案2

find . -type f -name '*_*.m' | while read FP
do
  FN="${FP##*/}"
  DN="${FP%/*}"
  ID="${FN%_*}"
  echo $FP "=>" $DN "/" $ID "/" $FN
  mkdir "$DN/$ID" 2>/dev/null
  mv "$FP" "$DN/$ID"
done

相关内容