파일 이름을 바꾸고 날짜 및 시간 접두사를 추가하세요.

파일 이름을 바꾸고 날짜 및 시간 접두사를 추가하세요.

타임스탬프 접두사를 추가하고 파일에 확장자를 추가하기 위해 스크립트를 사용하려고 합니다. 파일이 있습니다알파벳나는 다음으로 이름이 바뀔 것이다.ABC.txt

DIRECTORY=`find /path/to/file -type f ! -name "*.*"`
NOW=$(date +%Y-%m-%d-%H%M%S)

for file in $DIRECTORY; do

    mv "$file" "$file"_"${NOW}.txt"
    done

위의 출력은 작동하지만 전환하면 접미사로 사용됩니다.

    mv "$file" "${NOW}"$file".txt"

점점 더 못하겠어mv: `2019-10-18-231254/path/to/file/ABC.txt'를 이동할 수 없습니다. 해당 파일이나 디렉터리가 없습니다.

mv를 실행할 때 호출되는 전체 경로이므로 $Directory에 문제가 있음을 알 수 있습니다. 누구든지 이것을 단순화하는 데 도움을 줄 수 있습니까?

답변1

find다음과 같은 이유로 명령 출력을 반복하지 않는 것이 좋습니다 .

대신 -execdir경로 구성 요소를 제거하려면 , 및 셸 단일 라이너를 사용하는 것이 좋습니다.

#!/bin/bash

export NOW=$(date +%Y-%m-%d-%H%M%S)

find /path/to/file -type f ! -name '*.*' -execdir sh -c '
  for f; do echo mv "$f" "${NOW}_${f#./}"; done
' find-sh {} +

echo올바른 일을 하고 있다고 생각되면 제거하세요. NOW해당 값을 하위 쉘에서 사용할 수 있도록 내보내는 것이 필요합니다 sh -c.

find구현에서 경로를 제공하지 않는 경우 명시적인 경로 제거 및 교체를 -execdir사용할 수 있습니다 .-exec

find /path/to/file -type f ! -name '*.*' -exec sh -c '
  p="${1%/*}"; echo mv "$1" "$p/${NOW}_${1##*/}"
' find-sh {} \;

답변2

GNU 병렬 처리 사용:

find /path/to/file -type f ! -name "*.*" -print0 |
  parallel -0 mv {} {//}/$(date +%Y-%m-%d-%H%M%S)_{/}.txt

타임스탬프에 ISO8601을 사용하는 것을 고려해보세요.

find /path/to/file -type f ! -name "*.*" -print0 |
  parallel -0 mv {} {//}/$(date +%Y-%m-%dT%H:%M:%S)_{/}.txt

또는:

find /path/to/file -type f ! -name "*.*" -print0 |
  parallel -0 mv {} {//}/$(date +%Y%m%dT%H%M%S)_{/}.txt

이는 나중에 표준화된 ISO8601 파서를 사용하여 타임스탬프를 구문 분석할 수 있음을 의미합니다.

관련 정보