저는 Bash 스크립팅을 처음 사용하지만 이를 사용하여 Ubuntu 16.04의 디렉터리 및 하위 디렉터리에 있는 파일의 파일 이름을 제거하거나 이름을 바꾸는 몇 가지 솔루션을 발견했습니다. 예를 들어 내 파일 구조는 아래와 같습니다. 따라서 는 FolderFruit,,,
기본 디렉터리의 파일 이름입니다. 하위 디렉터리의 파일 이름입니다 SubFolderApple???.
SubFolder!!!Kiwi
. , 및 는 개별 파일의 파일 이름입니다.SubFolder_Food_Banana
ListAppleFood
ListKiwiFood
ListBanana
>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' {} \; \)
두 명령은 점을 처리할 수 있다는 점을 제외하면 기본적으로 동일한 작업을 수행합니다.