したがって、現在のパスは次のようになります。
../CAMERA3/serialnum/2016-12-19/001/dav/07/07.02.53-07.03.14[M][0@0][0].dav
最終目標:
../CAMERA3/2016-12-19_07.02.53-07.03.14.dav
だから私は基本的に、次のようにいくつかのディレクトリ名とファイル名の一部を抽出するためのforループを見つけようとしています。
mv ../$dir1/$dir2/$dir3/$dir4/$dir5/$dir6/$filenameportion[M][0@0][0].dav ../$dir1/$dir3_$filenameportion.dav
答え1
ついに使うべきだった米。少し醜いが動作します。
find /mnt/test -name '*.dav' -exec sh -c 'for filename do
if [[ $(basename "$filename") != C*.dav ]];then
find "$filename" -type f -execdir ~/bin/rnm -y "$filename" -ns '/pd05/_/pd03/_/n/.dav' \;
fi
done' find-sh {} \;
find /mnt/test -name '*.dav' -exec sh -c 'for filename do
rename "[M][0@0][0]" "" "$filename"
done' find-sh {} \;
find /mnt/test -name '*.dav' -type f -execdir sh -c 'mv "$@" ./../../../../..' find-sh {} \;
PS:はい、私はユーザーです。最初はゲストとして投稿し、メールリンクに沿ってアカウントを作成しました。驚くほど自動ではありません。バックスラッシュの混乱により申し訳ありません。ファイルをWindowsノートブックにコピーした後、公開用にもう一度変更することを忘れていました。
アップデート1:出力を見つけるためにループを削除しました。
答え2
ポールを改善してみてください回答:
以下のコード:
find /mnt/test -name '*.dav' -exec sh -c 'for filename do
if [[ $(basename "$filename") != C*.dav ]];then
find "$filename" -type f -execdir ~/bin/rnm -y "$filename" -ns '/pd05/_/pd03/_/n/.dav' \;
fi
done' find-sh {} \;
次のように最適化できます(find
またはfor
ループなし)。
rnm -y -ns '/pd5/_/pd3/_/n/.dav' -ss '^[^C].*\.dav$' -fo -dp -1 /mnt/test
説明する:
-ss
:検索文字列(正規表現)です。上記で使用されている正規表現は、で終わるファイルや.dav
起動しないファイルを検索しますC
。
-fo
:ファイルモード専用です。
-dp
:深さ。-1
無制限の深さを意味します。つまり、すべてのサブディレクトリに移動します。
-ns
:name文字列(新しい名前)
/pd<digit>/
:さまざまなレベルの親ディレクトリ名を表す名前文字列規則:0はすぐに親ディレクトリ、1は上のディレクトリなどです。
/n/
:拡張子のないファイル名を表す別の名前文字列規則。 (氏名)/n/.dav
に置き換えることができます。/fn/
-y
--yes
:すべて確認してください()。