Ubuntu 16.04에서 파일, 하위 디렉터리 및 디렉터리의 파일 이름에 있는 구두점(? !) 및 문자열의 이름을 바꾸거나 제거하는 Bash 스크립트

Ubuntu 16.04에서 파일, 하위 디렉터리 및 디렉터리의 파일 이름에 있는 구두점(? !) 및 문자열의 이름을 바꾸거나 제거하는 Bash 스크립트

저는 Bash 스크립팅을 처음 사용하지만 이를 사용하여 Ubuntu 16.04의 디렉터리 및 하위 디렉터리에 있는 파일의 파일 이름을 제거하거나 이름을 바꾸는 몇 가지 솔루션을 발견했습니다. 예를 들어 내 파일 구조는 아래와 같습니다. 따라서 는 FolderFruit,,,기본 디렉터리의 파일 이름입니다. 하위 디렉터리의 파일 이름입니다 SubFolderApple???. SubFolder!!!Kiwi . , 및 는 개별 파일의 파일 이름입니다.SubFolder_Food_BananaListAppleFoodListKiwiFoodListBanana

>FolderFruit,,,
>>   SubFolderApple??
>>>      ListAppleFood.txt
>>   SubFolder!!Kiwi
>>>      ListKiwiFood.pdf
>>   SubFolder_Food_Banana
>>>      ListBanana.csv

목표는 구두점(예: ? 및 !)과 해당 파일 이름 사이에 나타나는 문자열 'Food'를 제거하여 위의 파일 이름을 아래와 같이 변경하는 것입니다.

>FolderFruit
>>   SubFolderApple
>>>      ListApple.txt
>>   SubFolderKiwi
>>>      ListKiwi.pdf
>>   SubFolderBanana
>>>      ListBanana.csv

지금까지 아래와 같이 스크립트를 작성했지만 작동하지 않습니다. 따라서 숙련된 Bash 또는 Linux 사용자로부터 도움을 받고 싶습니다.

shopt -s globstar for f in ./**; do sed 's/\([[:punct:]]\)/\\\1/g' "$f" done

답변1

for 루프를 사용하는 대신 다음 find과 함께 사용할 수 있습니다 -execdir.

$ find -depth -mindepth 1 -type f,d -execdir \
  rename 's/((Sub)?Folder|Food|List|[_,!?])//g' {} \;

주석에 대해 자세히 설명하면 이름 바꾸기는 파일과 디렉터리를 구분하지 않으므로 .ext를 보존하기가 기하급수적으로 더 어려워집니다. 이 경우 프로세스를 두 단계로 나누어 파일과 디렉터리를 별도로 처리하는 것이 더 좋다고 생각합니다.

$ find -mindepth 1 -depth \
   \( -type f -execdir rename 's/(List|Food|[[:punct:]])(?![^.]*$)//g' {} \; \) \
-o \( -type d -execdir rename 's/((Sub)?Folder|Food|[[:punct:]])//g' {} \; \)

두 명령은 점을 처리할 수 있다는 점을 제외하면 기본적으로 동일한 작업을 수행합니다.

관련 정보