Bash에는 _
.
나는 그것을 포함하는 모든 파일에서 접두사를 사용 rename
하거나 mv
간단히 제거할 수 있다고 확신합니다._
나는 시도한다:
for file; do
mv "$file" "${file//_/}"
done
그러나 이것은 내가 원하는 효과를 얻지 못했습니다. _
모든 파일에서 접두어를 제거하려면 어떤 명령을 사용할 수 있습니까 ?
답변1
1) for file; do
스크립트의 명령줄 매개변수인 루프 위치 매개변수입니다. for file in *; do
디렉터리의 파일을 반복하는 데 사용됩니다 (또는 _*
밑줄이 앞에 붙은 파일만 가져옵니다).
2) 파일 이름 시작 부분의 밑줄을 제거하는 ${file#_}
대신 사용할 수 있습니다 . 특히 처음부터 섹션을 제거했습니다. 이는 표준 기능이며 물론 로 제거됩니다 .${file//_/}
${par#word}
${par/pat/repl}
${file//_}
모두첫 번째 슬래시뿐만 아니라 슬래시(이중 슬래시를 사용했기 때문에).
3) 최소한 Linux(GNU Userland) 및 FreeBSD에서는 mv -n
이를 사용하여 파일을 덮어쓰지 않도록 요청할 수 있습니다. 혹시라도.
그래서,
for file in _*; do
mv -n -- "$file" "${file#_}"
done
답변2
간단하게prename
(Perl 이름 바꾸기) 명령:
prename -n 's/^_//' _*
답변3
당신은 매우 가깝습니다:
for file in _*; do
if ! [[ -f "${file/_/}" ]]; then
mv "$file" "${file/_/}"
else
echo "Replacement for '$file' already exists; skipping.." 1>&2
fi
done
왜 ${file/_/}
? 밑줄 접두사를 지정했기 때문입니다. 그래서 _file_name.ext
그것은 될 것입니다 file_name.ext
. 당신이 그것을 가지고 있다면 ${file//_/}
, _file_name.ext
당신은 그것이 될 것입니다 filename.ext
.
답변4
당신은 sed를 사용할 수 있습니다
for file in /some/path/*; do
if [ -f "$file" ]; then
mv "$file" `echo "$file" | sed 's*_**g'`
fi
done