たとえば、次の一般的な形式の複数のファイルを含むディレクトリがあります。
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~
もちろん、シェルで直接使用することも、スクリプトで同様の構文を使用することもできます。
答え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