저는 현재 운영 체제 과정을 수강하고 있으며 이 과정의 일부로 bash 스크립트 작성 방법을 배우고 있습니다. 스크립트를 통해 하위 디렉터리를 건드리지 않고 디렉터리의 모든 파일에 날짜를 추가해야 합니다. 나는 모든 파일에 날짜를 추가하는 한 줄짜리 스크립트를 작성해 왔지만 현재 디렉터리의 폴더에도 적용됩니다.
for f in *; do mv -- "$f" "$f-$(stat -c %Y "$f" | date +%Y%m%d)"; done
이렇게 하면 파일 이름 끝에 날짜가 추가되지만 앞서 말했듯이 그 아래 디렉터리에 도달하게 됩니다. 저는 현재 RedHatLinux에서 bash 버전 4.1.2를 사용하고 있습니다.
Unix에 대한 경험이 부족하여(저는 주로 Windows 사용자입니다) 모든 사람이 여기에 있기 때문에 혼란스럽습니다. 어떤 도움이라도 주시면 감사하겠습니다.
답변1
slm이 이미 지적했듯이 $f
일반 파일을 테스트할 수 있습니다. 배우면서 스크립트를 한 줄이 아닌 것으로 변경할 예정이지만 읽고 유지하기가 더 어려워지는 경향이 있습니다.
for f in *
do
if [ -f "$f" ]
then
mv -- "$f" "$f-$(stat -c %Y "$f" | date +%Y%m%d)"
fi
done
( ;
나중에 줄바꿈을 삽입하고 제거하여 축소할 수 있습니다)
인수가 일반 파일(장치나 디렉터리가 아님)인지 테스트합니다 -f
. 다른 테스트도 있습니다( 예: 디렉터리에 대한 경우에도 테스트 -d
할 수 있습니다 ).if [ ! -d "$f" ]
답변2
이것은 당신이 원하는 것을 할 것입니다;
for file in $(find . -type f); do mv -- "$file" "$file-$(stat -c %Y "$file" | date +%Y%m%d)"; done
새 부분을 설명하려면 find 명령을 사용하여 파일만 찾습니다(-f 입력).
find . -type f
.
답변3
루프가 전혀 필요하지 않으며 find
옵션 +와 함께 사용하십시오.exec
sh -c
find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(stat -c %Y "$0" | date +%Y%m%d)' {} \;
그러나 파이프는 나에게 그다지 의미가 없습니다 stat
. date
추가하고 싶다면현재의stat
그러면 모든 파일 이름에 날짜가 전혀 필요하지 않습니다.
find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(date +%Y%m%d)' {} \;
반면에 시간을 추가하려면마지막 검토그런 다음 각 파일에 대해 -r
다음 옵션을 사용하십시오 date
.
find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(date -r "$0" +%Y%m%d)' {} \;
원하는 경우 연습을 위해 출력을 stat
입력 으로 사용한 date
다음 명령 --date
옵션을 사용하십시오 date
.
find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(date +%Y%m%d --date=@$(stat -c %Y "$0"))' {} \;