ポールを改善してみてください回答:

ポールを改善してみてください回答:

したがって、現在のパスは次のようになります。

../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:すべて確認してください()。

関連情報