내 상위 폴더에는 하위 폴더가 포함되어 있습니다. 각 하위 폴더에는 다음과 같은 폴더가 있습니다.
Parent_folder
folder1
folder_01_PAP_515151
folder_02_PAPA_554651
folder_03_PAPX_541313
folder_04_PAP_654123
folder2
folder_20_PAP_413513
folder_02_PAPD_521354
folder_055_PAP_685413
folder_100_PAP_132312
folder3
folder_11_PAPE_5313351
folder_32_PAP_3513131
folder_53_PAP_3213321
folder_84_PAP_3313213
..
다음 명령을 사용하여 "를 포함하는 모든 폴더와 하위 폴더를 나열합니다.폐 고혈압"를 입력하고 텍스트 파일 "list.txt"에 저장합니다.
find -type d -name "*_PAP_" > list.txt
출력은 다음과 같습니다.
./folder1/folder_01_PAP_515151
./folder1/folder_04_PAP_654123
./folder1/folder_20_PAP_413513
./folder2/folder_055_PAP_685413
./folder2/folder_100_PAP_132312
./folder3/folder_32_PAP_3513131
./folder3/folder_53_PAP_3213321
./folder3/folder_84_PAP_3313213
이 목록에서 새 폴더를 만들고 싶습니다. 새 폴더의 이름에는 "055_PAP", "32_PAP", "53_PAP"와 같은 이전 목록의 "3자리_PAP" 부분이 포함되어야 합니다.... 새로 생성된 폴더 목록은 다음과 같아야 합니다.
01_PAP
04_PAP
20_PAP
055_PAP
100_PAP
32_PAP
53_PAP
84_PAP
답변1
파일( list
다음 내용을 포함하는 이름)이 있고 파일의 각 줄 이름에 대해 디렉터리를 생성해야 하는 경우 디렉터리 이름은 ./folder?/folder_
.
./folder1/folder_01_PAP_515151
./folder1/folder_04_PAP_654123
./folder2/folder_055_PAP_685413
./folder2/folder_100_PAP_132312
./folder3/folder_32_PAP_3513131
./folder3/folder_53_PAP_3213321
./folder3/folder_84_PAP_3313213
그러면 할 수 있습니다.
cat list | sed -r -e 's~[.]/folder[0-9]+/folder_~~' | xargs -I{} mkdir -p «prefix»{}
- 폴더 번호를 하나 이상의 숫자로 설정했습니다.
- 접두사가 필요하지 않은 경우 "접두사"를 비워 두세요.
원본 내용을 유지하면서 원본 폴더/디렉토리의 이름을 바꾸려면 다음을 수행할 수 있습니다.
이것으로 테스트해보세요. 그런 다음 이름 바꾸기에서 제거 -n
하고 실제로 수행하십시오.
find . -type d -name "*_PAP_" | rename -n 's~[.]/folder[0-9]+/folder_~~'
rename
검색 패턴은 과 동일합니다 sed
. rename
파일 이름에 적용되고, sed
파일 또는 스트림에 적용됩니다.
옵션 sed
:
-r
확장 정규식(사용할 정규식의 방언)을 사용합니다.-e
다음 매개변수는 표현식(sed 프로그램)입니다.'s~[.]/folder[0-9]+/folder_~~'
쉘이 해석하지 않도록 인용된 표현식입니다.
이 표현은 다음을 설명합니다.s~[.]/folder[0-9]+/folder_~~
s
검색 및 바꾸기~
구분 기호는 표현식을 여러 부분으로 나누므로 어떤 문자든 사용할 수 있지만 매번 동일한 문자를 사용해야 합니다.s~«search_for»~«replace_with»~«options»
아니면 다른 문자를 사용하세요s@«search_for»@«replace_with»@«options»
.- «search_for» 정규 표현식:
[.]
한 지점/folder
정확히 그것이 말하는 것입니다.[0-9]
숫자.+
하나 이상의 선행 원자(숫자)(따라서 하나 이상의 숫자)./folder_
정확히 그것이 말하는 것입니다.
- «replace_with» 다른 것으로 바꾸십시오. 이 경우에는 아무것도 아닙니다.
- 이 경우 "옵션"을 참고하세요. 다른 옵션에는
i
대소문자 무시가 포함되어 있으며g
여러 번 수행하세요(첫 번째 문자열만 찾는 것이 아님).
sed
/언어는 rename
복잡하지만 매우 강력합니다. 당신이 사용할 주요 것은 s
(여기서 사용된 것과 같이) 아마도 next 이며 y
, 그것들은 배울 가치가 있습니다. 또한 정규식(grep 및 기타 명령에도 사용됨)을 배워야 합니다.