Linux는 알 수 없는 단일 파일의 이름을 new_file.txt로 바꿉니다.

Linux는 알 수 없는 단일 파일의 이름을 new_file.txt로 바꿉니다.

여러 파일의 이름을 동일한 패턴을 가진 새 파일로 일괄적으로 바꾸는 많은 예를 발견했습니다. 하지만 한 파일의 이름을 고정된 파일 이름으로 바꾸고 싶습니다. 나는 부분적으로 날짜를 기반으로 한 변수 이름이 있지만 이름에 다른 임의의 문자가 포함된 새 파일을 자주 받습니다. 그런 다음 일부 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, 등) 에 저장됩니다. 이 목록의 길이는 쉘의 특수 변수에 의해 유지되며 단일 파일 이름 일치가 예상됩니다.$3set$#

시험:

$ 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 ~

참고: 새 파일이 여러 디렉터리에 깊이 포함되어 있으면 제대로 작동하지 않습니다.

관련 정보