
다음과 같은 디렉토리 구조가 있습니다.
├── 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
. 그러나 대안이 있습니다.{.}
{/}
find
fd
(때때로 fdfind
) 이를 사용하면 다음을 실행할 수 있습니다.
fd -e json -x mv -- {} {.}
fd -e json
"execute"를 나타내는 json
확장자가 있고 그 뒤에 파일 이름에 대한 자리 표시자와 확장자가 없는 파일 이름(동일한 문자열로 대체됨)이 오는 파일 찾기 를 나타 냅니다 .-x
{}
{.}
gnu parallel
이전 버전의 and 에서는 ( as {}
)를 인용해야 하며 '{}'
, 이 경우 , , / 는 특별한 의미를 갖습니다.rc
akanga
fish
{.}
csh
tcsh
zsh -o braceccl
{
}
또한 숨겨진 파일(이름이 a로 시작하는 파일 또는 이름이 a로 시작하는 디렉터리에 있는 파일 )은 기본적으로 무시됩니다 fd
(이름이 a로 시작하는 파일과 반대 ). 그리고 / / / 에 언급된 파일도 무시됩니다 . .. 파일; / , / , / 옵션이 변경됨) 및 UTF-8로 디코딩할 수 없는 이름(로케일에 관계 없음)을 참조하세요.find
.
.
.ignore
.gitignore
.git/ignore
.fdignore
-H
--hidden
-I
--no-ignore
-u
--unrestricted