중첩된 디렉터리의 특정 파일을 경로에서 파생된 이름으로 반복적으로 이동합니다.

중첩된 디렉터리의 특정 파일을 경로에서 파생된 이름으로 반복적으로 이동합니다.

다른 중첩 디렉터리에 일부 파일이 있습니다. 모든 파일의 이름은 입니다 Analysis.mzXML. 이전에 저장된 디렉토리에 따라 각 이름을 다른 이름으로 변경하면서 모든 파일을 한 곳에 보관하고 싶습니다.

파일을 이동하고 디렉토리 이름을 지정하는 것이 다른 질문에 표시된 것으로 알고 있습니다.이것,이것그리고이것.

그러나 프로그램을 사용하여 한 디렉토리 밖으로 이동하고 해당 디렉토리를 기반으로 이름만 변경합니다. 내 경우에는 중첩된 디렉터리의 전체 경로를 사용하여 파일 이름을 바꾸고 싶었습니다.

모든 파일은 다음과 같이 저장됩니다.

/dir1/dir2/dir3/dir4/dir5/dir6/Analytic.mzXML

각각은 Analysis.mzXML다른 이름을 가진 폴더에 중첩되어 있습니다. 하지만 dir6우연히 모든 파일의 이름이 동일하고 중요한 정보를 제공하지 않으므로 건너뛰고 싶습니다.

내 기대는 일부 명령이나 스크립트를 실행하면 다음과 같은 특정 경로로 이름이 지정된 모든 파일을 얻을 수 있다는 것입니다.

/dir1_dir2_dir3_dir4_dir5.mzXML

방금 bash를 사용하기 시작했는데 이 문제를 해결하는 방법을 모르겠습니다.

답변1

작성된 바와 같이 귀하의 질문은 파일이 , , , 또는 유사한 가능성이 없거나 부적절한 위치에 Analysis.mzXML나타나더라도 전체 파일 시스템에서 파일을 검색하고 파일을 루트 디렉토리로 이동하고 싶다는 것을 나타냅니다. 있을 것 같지 않은/부적절한. 나는 당신이 다른 디렉토리에서 작업하고 있다고 가정합니다./lib/perl5/5.14/Unicode/Collate/Locale/proc/sys/net/ipv4/conf/all/sys/devices/system/cpu/cpu0/cache/usr/share/doc/cmake/html/_sources

다음 명령을 실행하세요:

find . -mindepth 7 -maxdepth 7 -type f -name Analysis.mzXML -exec sh -c 'for arg do echo mv -i -- "$arg" "$(echo "$arg" | sed -e "s|^\./||" -e "s|/dir6/Analysis\.mzXML|.mzXML|" -e "s|/|_|g")"; done' sh {} +

-mindepth 7 -maxdepth 7Analysis.mzXML모든 파일이 7번째 레이어에 있다고 확신한다면 생략해도 됩니다. 이 명령은 Analysis.mzXML일곱 번째 계층의 모든 파일을 찾아 미니셸 스크립트에 전달합니다. 이는 각 경로 이름을 가져와서 파일 이름의 ./시작과 dir6끝, 일부를 제거 하고 나머지 모든 문자를 로 변경합니다 . 그러면 다음과 같은 출력이 생성됩니다.Analysis/_

mv -i -- ./dir1/dir2/dir3/dir4/dir5/dir6/Analysis.mzXML dir1_dir2_dir3_dir4_dir5.mzXML
mv -i -- ./the/quick/brown/fox/jumps/dir6/Analysis.mzXML the_quick_brown_fox_jumps.mzXML
mv -i -- ./over/the/lazy/dog/foo bar/dir6/Analysis.mzXML over_the_lazy_dog_foo bar.mzXML

이것이 올바른 것으로 보이면 명령을 다시 실행하되 첫 번째 명령을 제거하십시오 echo(예: echo mv그냥 으로 변경 mv).

노트:

  • 이는 6번째 레벨 디렉토리가 실제로 호출되는지 확인하지 않습니다 dir6. Analysis.mzXML에서 파일을 찾으면 파일 dir11/dir12/dir13/dir14/dir15/dir16이름 dir11_dir12_dir13_dir14_dir15_dir16_Analysis.mzXMLdir11_dir12_dir13_dir14_dir15.mzXML.
  • 이미 존재하는 이름으로 파일을 이동하려고 하면 확인 메시지가 표시됩니다 -i.mv
  • --다음으로 시작하는 논쟁으로부터 당신을 보호 해야 합니다 .-. $arg항상 로 시작해야 하므로 문제가 되지 않습니다 ./.
  • 정말로 파일 시스템 루트에서 이 작업을 수행하려면 그렇게 할 수 있어야 합니다. cd /위의 지침을 따르 십시오 .

나중에 생각해 보세요. 라는 디렉터리가 있으면 이 작업이 실패할 수 있습니다 Analysis.mzXML. 그러니 하지 마세요.

답변2

하나의 파일만 이동을 사용하는 경우 mv소스 파일 이름을 지정한 다음 대상 파일 이름을 지정하십시오.또는대상 디렉터리(다른 디렉터리에서 동일한 이름을 가지려는 경우) 예를 들어

mv /path/to/Analysis.mzXML /new/directory/new-filename.mzXML

또는 (새 디렉터리에 동일한 파일 이름을 유지):

mv /path/to/Analysis.mzXML /new/directory/

여러 파일을 이동하려면 대상을 지정하세요.~ 해야 하다디렉토리입니다. 예를 들어

 mv /path/to/*.mzXML /new/directory/

cp하나 이상의 파일을 복사하려면( mv.

관련 정보