여러 파일의 이름을 동일한 패턴을 가진 새 파일로 일괄적으로 바꾸는 많은 예를 발견했습니다. 하지만 한 파일의 이름을 고정된 파일 이름으로 바꾸고 싶습니다. 나는 부분적으로 날짜를 기반으로 한 변수 이름이 있지만 이름에 다른 임의의 문자가 포함된 새 파일을 자주 받습니다. 그런 다음 일부 sed
작업을 수행한 다음 데이터베이스로 가져올 수 있도록 파일 이름을 변경하고 싶습니다 . 그러면 두 파일이 모두 삭제됩니다.
받다 | 생각하다 |
---|---|
20210809-random-numbers.txt |
new_file.txt |
나는 시도했다:
mv *.txt new_file.txt
단일 옵션에 대한 여러 옵션이기 때문에 이것이 작동하지 않을 것이라고 생각합니다.
답변1
파일을 찾고 싶다고 가정 해 보겠습니다.오늘의날짜 YYYYMMDD
형식은 파일 이름의 시작 부분에 있으며 패턴과 일치 YYYYMMDD-*.txt
하고 이름을 로 바꿉니다 new_file.txt
. 이 bash
스크립트는 다음을 수행합니다.
#!/bin/bash
# Make non-matching globbing patterns disappear.
shopt -s nullglob
# Get today's date.
printf -v today '%(%Y%m%d)T' -1
# Get names in the current directory matching our pattern.
set -- "$today"-*.txt
# Sanity check.
if [ "$#" -ne 1 ]; then
printf 'There are %d names matching "%s-*.txt", expected 1\n' \
"$#" "$today" >&2
exit 1
fi
# Inform user of action and proceed.
printf 'Renaming "%s" into "new_file.txt"\n' "$1"
mv -f "$1" new_file.txt
이는 현재 디렉터리 외부의 이름과 일치하며 단일 파일이 예상 형식과 일치하면 이름이 변경됩니다 new_file.txt
. 파일이 여러 개 또는 0개라도 패턴과 일치하면 사용자에게 알리고 종료됩니다.
일치하는 파일 이름은 내장 명령으로 설정된 위치 인수 목록(예: $1
, $2
, 등) 에 저장됩니다. 이 목록의 길이는 쉘의 특수 변수에 의해 유지되며 단일 파일 이름 일치가 예상됩니다.$3
set
$#
시험:
$ ls
script
$ ./script
There are 0 names matching "20210808-*.txt", expected 1
$ touch 20210808-blahblah-{1..5}.txt
$ ls
20210808-blahblah-1.txt 20210808-blahblah-4.txt
20210808-blahblah-2.txt 20210808-blahblah-5.txt
20210808-blahblah-3.txt script
$ ./script
There are 5 names matching "20210808-*.txt", expected 1
$ rm 20210808-blahblah-[2-5].txt
$ ls
20210808-blahblah-1.txt script
$ ./script
Renaming "20210808-blahblah-1.txt" into "new_file.txt"
$ ls
new_file.txt script
답변2
date
( man date
) ( +format
및 --date=
옵션), find
( man find
) 및 신중한 쉘 인용( ) 을 사용 man bash
하고 다음과 같은 작업을 수행합니다(테스트되지는 않았지만 확인하는 데 사용 shellcheck.org
).
#!/bin/bash
# Yesterday's file
tgt="$(date "+%Y%m%d" --date="yesterday")"
# Today's file
tgt="$(date "+%Y%m%d" )"
# find the file - check to ensure we find only 1 file
file="$(find $PWD -maxdepth 1 -type f -name "${tgt}\*.txt" -print)"
if [[ $(echo "$file" | wc -l) -ne 1 ]] then
echo "Too many files $file"
exit 1
fi
echo mv "$file" new_file.txt
# or just process `"$file"` with `sed`.
exit 0
답변3
노력하다:
find /your-path-here -name "`date +%Y%m%d`-*.txt" -exec mv {} your-path-here/new_file.txt \;
tested on cygwin:
pt@ptphoto7 ~
$ ls -l ./test ; find ./test -name "`date +%Y%m%d`-*.txt" -exec mv {} test/new-file.txt \;
total 3
-rw-r--r--+ 1 pt None 2 Aug 15 13:49 20210810-stuff-and-things.txt
-rw-r--r--+ 1 pt None 2 Aug 15 13:49 20210812-stuff-and-things.txt
-rw-r--r--+ 1 pt None 2 Aug 15 13:49 20210815-stuff-and-things.txt
pt@ptphoto7 ~
$ ls -l ./test
total 3
-rw-r--r--+ 1 pt None 2 Aug 15 13:49 20210810-stuff-and-things.txt
-rw-r--r--+ 1 pt None 2 Aug 15 13:49 20210812-stuff-and-things.txt
-rw-r--r--+ 1 pt None 2 Aug 15 13:49 new-file.txt
pt@ptphoto7 ~
참고: 새 파일이 여러 디렉터리에 깊이 포함되어 있으면 제대로 작동하지 않습니다.