저는 Linux와 터미널을 처음 사용하지만 몇 가지 문제에 봉착했습니다.
약 50개의 상위 폴더가 있고 모두 하위 폴더를 포함하고 있습니다. 한 하위 폴더의 이름은 입니다 . 다른 하위 폴더에는 하위 폴더로 이동하려는 파일이 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
옵션은 데이터 손실을 방지하는 데 도움이 됩니다.