私はLinuxとターミナルを初めて使用していますが、いくつかの問題に固執しました。
約50個の親フォルダがあり、すべてサブフォルダが含まれています。 1つのサブフォルダの名前はです。他のサブフォルダには、サブフォルダに移動したいファイルがfiltered_feature_bc_matrix
あります。.mtx
.tsv
filtered_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
満足すれば削除(テスト実行))。
find
Bourneに似たシェルを使用すると、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
オプションはデータの損失を防ぐのに役立ちます。