다음과 같은 파일 목록이 있습니다.
file.txt file (1).txt file (2).txt file (7).txt
등.
그 중 큰(숫자) 것이 마지막으로 업데이트된 파일이지만 중간 숫자 중 일부가 누락될 수 있으며 디렉토리에 다른 파일이 있을 수 있습니다.
"중복" 파일이 있는지 어떻게 확인하고, 그렇다면 내용을 에 복사하고 file (maxnumer).txt
모든 file.txt
파일을 삭제합니다 file (*).txt
.
ls -t file*(*)*.txt
목록을 나열한 다음 반복을 시도했지만 for
오류( )가 발생했습니다 ls
.bash:syntax error near unexpected token '('
답변1
타임스탬프가 신뢰할 수 없다고 가정하면 파일 이름 끝에 괄호 안에 가장 큰 숫자가 있는 파일을 찾으려고 합니다.
이 방법:
#!/bin/sh
prefix=$1
if [ -z "$prefix" ]; then
printf 'Usage: %s prefix [ suffix ]\n' "$0" >&2
exit 1
fi
suffix=$2
for filename in "$prefix ("*")$suffix"; do
[ ! -f "$filename" ] && continue
num=${filename##*\(} # "file (xx).txt" --> "xx).txt"
num=${num%\)*} # "xx).txt" --> "xx"
# if no max number yet, or if current number is higher, update max
if [ -z "$max" ] || [ "$num" -gt "$max" ]; then
max=$num
fi
done
# if we have a max number, use it to rename the file and then remove the other files
if [ -n "$max" ]; then
printf 'Would move %s to %s\n' "$prefix ($max)$suffix" "$prefix$suffix"
# mv "$prefix ($max)$suffix" "$prefix$suffix"
printf 'Would remove %s\n' "$prefix ("*")$suffix"
# rm "$prefix ("*")$suffix"
else
printf 'Found no files matching "%s (*)%s"\n' "$prefix" "$suffix"
fi
실행하세요:
$ tree
.
|-- file (1).txt
|-- file (2).txt
|-- file (7).txt
|-- file.list
|-- file.txt
`-- script.sh
0 directory, 6 files
$ sh script.sh file .txt
Would move file (7).txt to file.txt
Would remove file (1).txt
Would remove file (2).txt
Would remove file (7).txt
(댓글을 삭제 mv
하고 rm
실제로 파일을 수정해보세요)
file (2) (30).txt
모든 파일 이름이 정수인 패턴을 따른다고 가정하기 때문에 (이것들도 일치함)와 같은 파일 이름에 대해서는 실패합니다 .prefix (NN)suffix
NN