サブディレクトリに複数のファイルがあり、別のディレクトリに移動したいと思います。
これらのディレクトリは、次のように親ディレクトリに設定されます。 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
}