例如,我有一个包含多个文件的目录,其通用格式如下:
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