フォルダを循環し、ファイルを別のディレクトリに移動する必要がありますか? [閉鎖]

フォルダを循環し、ファイルを別のディレクトリに移動する必要がありますか? [閉鎖]

サブディレクトリに複数のファイルがあり、別のディレクトリに移動したいと思います。

これらのディレクトリは、次のように親ディレクトリに設定されます。 Apr1995 Apr1996 Aug1995 など.​​.. (月と年)

たとえば、/ファイル/Apr1995です。

ファイル形式は次のとおりです。1995___.infoまたは1995___.dat

各サブディレクトリに移動して、ファイルを年ごとに区切られた別のディレクトリに移動してからフォーマットしたいと思います。このような:

OtherFiles/1995/info、OtherFiles/1995/dat、OtherFiles/1996/infoなど

1995年のディレクトリには、infoとdatというサブディレクトリが含まれています。

最後に、私は次の組織の例を望んでいます。

デスクトップ/ファイル/Apr1995/1995__.info,

デスクトップ/ファイル/Apr1995/1995__.dat,

デスクトップ/その他のファイル/1995/情報、

デスクトップ/その他ファイル/1995/datなど

私はいくつかのシングルライナーのようなさまざまなオプションを試しました。

 for d in ./*/ ; do (cd "$d" && mv 1995*.info /1995/info); done

または

 find ./ -type f -execdir mv 1995*.info /1995/info {} \;

mvエラーが発生したか、類似したファイルであることを認識していません。

シェルスクリプトも役に立ちます。

私は比較的単純に見えることに少し圧倒されました。どんな助けでも大変感謝します。

編集:追加された情報が役に立つことを願っています。

答え1

2番目のコマンドは機能しますが、ファイル名を指定しませんでした。1995_.infoおよび/またはパターンに一致するすべてのファイルを移動したい場合1995_.dat

find ./ -type f -name 1995*.info -exec mv {} /1995/info \;

find ./ -type f -name 1995*.dat -exec mv {} /1995/dat \;

1 つのコマンドですべての年に対して操作を実行するには、次のようにします。

for y in {1995..1999}; do $(find Years -type f -name $y*.info -exec mv {} '/'$y'/info' \;); done

for y in {1995..1999}; do $(find Years -type f -name $y*.dat -exec mv {} '/'$y'/dat' \;); done

これは、各年のディレクトリを繰り返してファイル名を見つけ、各年のディレクトリに移動します。

注:CentOS 7.4でこれをテストして確認しましたが、環境によっては*前にバックスラッシュを追加できるようにエスケープする必要があります。\*

答え2

for a in `find ~+ -type f -path '*199[0-9]*' -iname '199[0-9]*.*'`
{
 if [[ $a =~ \.(dat|info)$ ]]
 then
  n=${a##*/}
  n=${n%.*}; x=${a##*.}
  d=RootNewDir/$n/$x
  mkdir -p $d
  mv $a $d/${n}__$x
 fi
}

関連情報