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 "$@"
해당 명령줄에서 인수를 선택합니다. 또는 배열(목록)을 사용할 수도 있습니다. 또는 *
현재 디렉터리의 모든 디렉터리를 일치시키는 데 사용할 수 있습니다 .