for 루프를 사용하여 여러 하위 디렉터리의 여러 파일 이름 바꾸기

for 루프를 사용하여 여러 하위 디렉터리의 여러 파일 이름 바꾸기

for 루프를 사용하여 다른 하위 디렉터리에 있는 동일한 이름의 파일 이름을 바꾸려고 합니다. 하위 디렉터리 이름에 따라 이름을 바꿔야 합니다.

Subdirectory1/File.txt
Subdirectory2/File.txt

다음과 같아야합니다

Subdirectory1/Subdirectory1.txt
Subdirectory2/Subdirectory2.txt

많은 명령을 시도했지만 다른 오류가 발생했습니다. 포럼에서 찾은 마지막 명령도 작동하지 않았습니다. 누구든지 나를 도와줄 수 있나요?

dir="Subdirectory1, Subdirectory2"
declare -i count=1 for file in "$dir"/*.txt; do
mv "$file" "${dir}/${dir} ${count}.txt"
count+=1
done

실행 후 다음을 얻습니다.

mv: cannot stat ‘/*/*.txt’: No such file or directory

답변1

이와 같은 코드를 사용할 수 있습니다.

#!/bin/bash

# Loop across the list of directories
for dir in Subdirectory1 Subdirectory2
do
    # Only consider directories
    [ -d "$dir" ] || continue

    # Loop across any files in each directory
    for src in "$dir"/*.txt
    do
        dst="$dir/$dir.txt"
        
        # Only rename a file if it won't overwrite another one
        if [ -f "$dst" ]
        then
            # Refuse to overwrite
            echo "Target file already exists: $dst" >&2
        else
            # If the file already has the right name just skip
            [ -f "$src" ] && [ "$src" != "$dst" ] && mv -f -- "$src" "$dst"
        fi
    done
done

prepare 스크립트를 사용하세요(라고 가정 renamethem) chmod a+x renamethem. 그런 다음 ./renamethem.

디렉토리 목록이 for루프에 하드코딩되어 있음을 알 수 있습니다. 이 문제를 보다 우아하게 처리하는 다른 방법이 있습니다. 명령줄에 목록을 제공할 수 있습니다( ). ./renamethem Subdirectory1 Subdirectory2이 경우 한 줄을 변경하여 for dir in "$@"해당 명령줄에서 인수를 선택합니다. 또는 배열(목록)을 사용할 수도 있습니다. 또는 *현재 디렉터리의 모든 디렉터리를 일치시키는 데 사용할 수 있습니다 .

관련 정보