특정 확장자가 없는 모든 파일에 접미사를 추가하고 파일 확장자를 유지합니다.

특정 확장자가 없는 모든 파일에 접미사를 추가하고 파일 확장자를 유지합니다.

.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

...디렉토리를 건너뛰고 bazfoo와 bar의 이름을 적절하게 바꾸세요.

답변4

for f in `ls -I "*.zip" `; do mv $f `echo $f | cut -d '.' -f1`_suffix.`echo $f | cut -d '.' -f2` ; done ;

다른 흥미로운 도구로는 다음과 같은 유틸리티가 있습니다.이름을 바꿔라

이것은 흥미로운 질문이지만, 또한 그랬을 수도 있음을 의미합니다.묻다많은 시간. 디렉터리를 제외하지 않는 ls 작업을 유지했다는 점에 유의하세요.

관련 정보