.zip
파일과 기타 파일(모든 파일)이 포함된 디렉토리 가 있습니다.가지다확장자), 모든 파일에 접미사를 추가하고 싶습니다.아니요확장명 .zip
. 접미사를 선택하여 변수에 넣을 수 있었기 $suffix
때문에 다음 코드를 시도했습니다.
ls -I "*.zip"| xargs -I {} mv {} {}_"$suffix"
.zip
여기에는 닫히지 않았거나 닫혀 있지만 오류가 있는 모든 파일이 나열됩니다 . 다음 결과가 잘못 생성됩니다 file.csv
.
file.csv_suffix
궁금합니다 file_suffix.csv
. 파일 확장자를 유지하기 위해 코드를 어떻게 편집할 수 있나요?
답변1
사용하기에는 좀 위험합니다 ls
. 바라보다왜 `ls`를 구문 분석하지 *않나요*?
또한 파일 이름을 분리해야 합니다. 그렇지 않으면 $suffix
발견한 대로 파일 이름 끝에 추가하면 됩니다.
find
사용할 솔루션과 사용하지 않을 솔루션 은 다음과 같습니다 find
.
find . -type f ! -name '*.zip' -exec sh -c 'suffix="$1"; shift; for n; do p=${n%.*}; s=${n##*.}; [ ! -e "${p}_$suffix.$s" ] && mv "$n" "${p}_$suffix.$s"; done' sh "$suffix" {} +
이름이 로 시작하지 않는 현재 디렉토리 안이나 그 아래의 모든 일반 파일을 찾습니다 .zip
.
그러면 다음 셸 스크립트가 이러한 파일 목록과 함께 호출됩니다.
suffix="$1" # the suffix is passed as the first command line argument
shift # shift it off $@
for n; do # loop over the remaining names in $@
p=${n%.*} # get the prefix of the file path up to the last dot
s=${n##*.} # get the extension of the file after the last dot
# rename the file if there's not already a file with that same name
[ ! -e "${p}_$suffix.$s" ] && mv "$n" "${p}_$suffix.$s"
done
시험:
$ touch file{1,2,3}.txt file{a,b,c}.zip
$ ls
file1.txt file2.txt file3.txt filea.zip fileb.zip filec.zip
$ suffix="notZip"
$ find . -type f ! -name '*.zip' -exec sh -c 'suffix="$1"; shift; for n; do p=${n%.*}; s=${n##*.}; [ ! -e "${p}_$suffix.$s" ] && mv "$n" "${p}_$suffix.$s"; done' sh "$suffix" {} +
$ ls
file1_notZip.txt file3_notZip.txt fileb.zip
file2_notZip.txt filea.zip filec.zip
find
파일 수가 많지 않고 하위 디렉터리로의 재귀가 필요하지 않은 경우(파일 이름이 아닌 항목을 건너뛰도록 약간 수정한 경우) 위의 셸 스크립트를 독립적으로 실행할 수 있습니다.
#!/bin/sh
suffix="$1" # the suffix is passed as the first command line argument
shift # shift it off $@
for n; do # loop over the remaining names in $@
[ ! -f "$n" ] && continue # skip names of things that are not regular files
p=${n%.*} # get the prefix of the file path up to the last dot
s=${n##*.} # get the extension of the file after the last dot
# rename the file if there's not already a file with that same name
[ ! -e "${p}_$suffix.$s" ] && mv "$n" "${p}_$suffix.$s"
done
를 사용하면 bash
다음과 같은 디렉터리의 파일에 대해 이 명령을 실행할 수 있습니다.
$ shopt -s extglob
$ ./script.sh "notZip" !(*.zip)
에서 extglob
쉘 옵션을 설정 하면 현재 디렉토리에서 로 끝나지 않는 모든 이름이 일치됩니다 .bash
!(*.zip)
.zip
답변2
찾다+세게 때리다방법:
export suffix="test"
ㅏ) 및 검색 -exec
작업:
find your_folder -type f ! -name "*.zip" -exec bash -c 'f=$1; if [[ "$f" =~ .*\.[^.]*$ ]]; then ext=".${f##*\.}"; else ext=""; fi; mv "$f" "${f%.*}_$suffix$ext"' x {} \;
두번째) 또는 bash while
루프를 사용하십시오.
find your_folder/ -type f ! -name "*.zip" -print0 | while read -d $'\0' f; do
if [[ "$f" =~ .*\.[^.]*$ ]]; then
ext=".${f##*\.}"
else
ext=""
fi
mv "$f" "${f%.*}_$suffix$ext"
done
답변3
배쉬에서:
shopt -s extglob
suffix=yoursuffix
for entry in !(*.zip)
do
[[ -f "$entry" ]] || continue
base=${entry%.*}
if [[ "$entry" =~ \. ]]
then
ext=${entry##*.}
echo mv -- "$entry" "${base}_${suffix}.${ext}"
else
echo mv -- "$entry" "${base}_${suffix}"
fi
done
echo
적합하다고 판단되면 삭제하세요.
테스트 사례:
touch a.zip b.zip foo bar file.csv a.file.csv 'test case' 'test case.csv'
mkdir baz
예제 출력:
mv -- a.file.csv a.file_yoursuffix.csv
mv -- bar bar_yoursuffix
mv -- file.csv file_yoursuffix.csv
mv -- foo foo_yoursuffix
mv -- scr scr_yoursuffix
mv -- test case test case_yoursuffix
mv -- test case.csv test case_yoursuffix.csv
...디렉토리를 건너뛰고 baz
foo와 bar의 이름을 적절하게 바꾸세요.