와일드카드를 사용하여 파일 복사 및 타임스탬프 추가

와일드카드를 사용하여 파일 복사 및 타임스탬프 추가

Test_*.txt파일을 에 복사해야 합니다 Test_20190101_Timestamp.txt. 여기서 *와일드카드는 20190101날짜입니다.

cp test_*.txt test_*_"$(date +%Y%m%d-%H%M%S)".txt

파일을 복사하면 출력 복사본도 .로 끝납니다 Test_*_Timestamp.txt. 와일드카드를 사용하지 않고 전체 파일을 복사하려면 어떻게 해야 합니까?

저도 이거 해봤는데 역시 실패했어요

cp test_*.txt test*_"$(date +%Y%m%d-%H%M%S)".txt 
cp: target 'test*_20200102-160523.txt' is not a directory

답변1

파일을 반복해야 합니다.

for file in Test_*.txt; do
    fileroot=${file%.txt}    # remove the extension
    cp -v "$file" "${fileroot}_Timestamp.txt"
done

답변2

문제는 - 여러분이 발견한 바와 같이 - 초기 시도에서 와일드카드의 실제 값이 명령의 다른 매개변수 간에(즉, 소스 파일 이름에서 예상 대상 파일 이름으로) "전송"된다고 가정한다는 것입니다.

그러나 이는 쉘에서 와일드카드 확장(또는 "전역 확장")이 작동하는 방식이 아닙니다. 대신, 와일드카드가 나타날 때마다 셸은 이를 일치하는 파일 목록으로 내부적으로 확장하고 마치 전체 목록을 지정한 것처럼 명령을 실행합니다(예:이 튜토리얼쉘 와일드카드 정보). 그래서 파일이 있으면

Test_a.txt
Test_b.txt
Test_c.txt

디렉터리에서 cp명령은 실제로 입력한 것처럼 보입니다.

cp Test_a.txt Test_b.txt Test_c.txt Test_*_20200102-160523.txt

마지막 매개변수가 복사 명령의 대상으로 사용되고 여러 소스 파일을 지정했기 때문에 cp이것이 디렉토리라고 가정하고 해당 이름의 디렉토리가 존재하지 않는다고 불평합니다.

Test_*_20200102-160523.txt왜 이제 디렉토리가 없다고 불평합니까?문자 그대로의 의미 *내부에? 표준 동작(최소한 bash)은 와일드카드를 지정하고 일치하는 파일이 없으면 와일드카드는 문자 그대로 그 자체로 해석되며 표현식은 Test_*_20200102-160523.txt대상 파일 이름으로 의도되므로 현재 디렉토리에 아직 존재하지 않습니다.

이것이 @glennjackman의 답변 뒤에 있는 이유입니다. 원하는 결과를 얻으려면 입력 파일을 반복해야 합니다.

관련 정보