다른 중첩 디렉터리에 일부 파일이 있습니다. 모든 파일의 이름은 입니다 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 7
Analysis.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.mzXML
을dir11_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
.