複数のディレクトリを作成して複数のファイルを移動する方法

複数のディレクトリを作成して複数のファイルを移動する方法

たとえば、次の一般的な形式の複数のファイルを含むディレクトリがあります。

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

関連情報