타임스탬프 접두사를 추가하고 파일에 확장자를 추가하기 위해 스크립트를 사용하려고 합니다. 파일이 있습니다알파벳나는 다음으로 이름이 바뀔 것이다.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 파서를 사용하여 타임스탬프를 구문 분석할 수 있음을 의미합니다.