exec 찾기 - {}에서 파일 이름의 일부만 사용

exec 찾기 - {}에서 파일 이름의 일부만 사용

다음과 같은 디렉토리 구조가 있습니다.

├── file1.json
├── file2.json
└── file3.json

.json접미사를 제거하고 싶습니다 . 아마도 가장 좋은 방법은 rename명령을 사용하거나 를 사용하는 것이라는 것을 알고 있지만 명령으로도 이 작업을 수행할 수 있는지 for-loop궁금합니다 .find

예를 들어 연결은 .json간단합니다. 다음 명령을 실행합니다.

find . -type f -name 'file?' -exec mv {} {}.json \;

그런데 이제 이름 지정 프로세스를 되돌리고 싶은데 어떻게 해야 합니까 find?

답변1

.json.for example file1(match Pattern )을 추가하여 초기 프로세스의 file?이름을 바꿉니다 file1.json. Reverse는 더 복잡하며 약간의 쉘 스크립팅이 필요합니다.

find . -type f -name 'file?.json' -exec sh -c 'mv -- "$1" "${1%.json}"' _ {} \;

이는 sh발견된 각 파일에 대해 호출됩니다 find. 복잡성을 거의 증가시키지 않으면서 보다 효율적인 프로세스를 만들 수 있는 경우가 많습니다.

find . -type f -name 'file?.json' -exec sh -c 'for f in "$@"; do mv -- "$f" "${f%.json}"; done' _ {} +

두 솔루션 모두 ${var%suffix}에 해당하는 값을 반환하고 $var해당 값의 끝에서 리터럴 텍스트를 제거하는 POSIX 셸 교체 를 사용합니다(가능한 경우).suffix

var=hello.txt
echo "${var%.txt}"    # "hello" because ".txt" is removed
echo "${var%.zzz}"    # "hello.txt" because there is no ".zzz" suffix
echo "$var"           # "hello.txt" because the variable itself is unchanged

답변2

글쎄, 지침은 매우 명확합니다.

문자열 "{}"은 현재 처리 중인 파일의 이름으로 대체됩니다 [...]

find하다아니요등을 사용하는 등 파일 이름을 조작하기 위한 추가 자리 표시자를 제공합니다 gnu parallel. 그러나 대안이 있습니다.{.}{/}findfd(때때로 fdfind) 이를 사용하면 다음을 실행할 수 있습니다.

fd -e json -x mv -- {} {.}

fd -e json"execute"를 나타내는 json확장자가 있고 그 뒤에 파일 이름에 대한 자리 표시자와 확장자가 없는 파일 이름(동일한 문자열로 대체됨)이 오는 파일 찾기 를 나타 냅니다 .-x{}{.}gnu parallel

이전 버전의 and 에서는 ( as {})를 인용해야 하며 '{}', 이 경우 , , / 는 특별한 의미를 갖습니다.rcakangafish{.}cshtcshzsh -o braceccl{}

또한 숨겨진 파일(이름이 a로 시작하는 파일 또는 이름이 a로 시작하는 디렉터리에 있는 파일 )은 기본적으로 무시됩니다 fd(이름이 a로 시작하는 파일과 반대 ). 그리고 / / / 에 언급된 파일도 무시됩니다 . .. 파일; / , / , / 옵션이 변경됨) 및 UTF-8로 디코딩할 수 없는 이름(로케일에 관계 없음)을 참조하세요.find...ignore.gitignore.git/ignore.fdignore-H--hidden-I--no-ignore-u--unrestricted

관련 정보