하위 폴더에서 특정 파일을 찾아 특정 폴더로 이동, 일괄 처리

하위 폴더에서 특정 파일을 찾아 특정 폴더로 이동, 일괄 처리

저는 Linux와 터미널을 처음 사용하지만 몇 가지 문제에 봉착했습니다.

약 50개의 상위 폴더가 있고 모두 하위 폴더를 포함하고 있습니다. 한 하위 폴더의 이름은 입니다 . 다른 하위 폴더에는 하위 폴더로 이동하려는 파일이 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옵션은 데이터 손실을 방지하는 데 도움이 됩니다.

관련 정보