サブフォルダで特定のファイルを見つけて特定のフォルダに移動し、バッチ処理

サブフォルダで特定のファイルを見つけて特定のフォルダに移動し、バッチ処理

私はLinuxとターミナルを初めて使用していますが、いくつかの問題に固執しました。

約50個の親フォルダがあり、すべてサブフォルダが含まれています。 1つのサブフォルダの名前はです。他のサブフォルダには、サブフォルダに移動したいファイルがfiltered_feature_bc_matrixあります。.mtx.tsvfiltered_feature_bc_matrix

だから私の建築はこれです

Mother_folder(containing all the 50 parent folders) ->   
   parent_folder          
       ->filtered_feature_bc_matrix                
       ->other_subfolder
          ->other_subsubfolder
               files.mtx

私は試した:

for dir in ./; do
  $(find . -type f -name *.mtx -exec mv {} "./$dir/filtered_feature_bc_matrix" \;);
done

親フォルダに移動するとcd成功しますが、フォルダは50個なので、これを自動化する方法を知りたいです。

しかし、ターゲットディレクトリを正しく指定できなかったので、狂うようなものです;-)

私は明らかに言ったことを願っています!

カミール

編集する:

コードを実行すると、私のファイルMatrix.mtxは実際には目的のサブフォルダに移動さ​​れず、代わりにmother_folderに移動し、filtered_feature_bc_matrixに名前が変更されました。

答え1

そしてzsh

autoload zmv
cd /path/to/mother/folder &&
  zmv -n '*/^filtered_feature_bc_matrix/**/*.(mtx|tsv)(#q.)' \
         '${f:h1}/filtered_feature_bc_matrix/${f:t}'

-n満足すれば削除(テスト実行))。

findBourneに似たシェルを使用すると、rc次のことができます。

cd /path/to/mother/folder &&
  LC_ALL=C find .                             \
    '('                                       \
       -name '.?*' -o                         \
       -path './*/filtered_feature_bc_matrix' \
          ! -path './*/*/*'                   \
    ')' -prune -o                             \
    -path './*/*/*'                           \
    '('                                       \
       -name '*.tsv' -o                       \
       -name '*.mtx'                          \
    ')' -type f                               \
    -exec sh -c '
      ret=0
      for file do
        parent=${file%"${file#./*/}"}
        echo mv -i -- "$file" "${parent}filtered_feature_bc_matrix/" ||
          ret=$?
      done
      exit "$ret"' sh {} +

(満足したら削除してくださいecho)。

zmvはこれを保証しません。ただし、この-iオプションはデータの損失を防ぐのに役立ちます。

関連情報