2017-11-11 8 views
0

목록 ($ docs)에서 폴더 이름 집합을 모니터하는 스크립트가 있습니다. 폴더가 비어 있지 않으면 파일의 이름을 바꾸고 파일을 이동하고 타임 스탬프를 추가해야합니다. (folderplacement_filename.extBash : 형식이 지정된 날짜를 이름 바꾸기 정규식에 포함하십시오.

/foldername 
/anotherfoldername 

이 스크립트는 제대로 내 파일의 이름을 바꿉니다 :

docs="/home/user/docs.txt" 

cat $docs | while read line 
do 
if find "$line" -mindepth 1 -print-quit | grep -q .; then 
    find $line -type f | rename 's:(^|.*/)([^/]*)/([^/]*)$:/tmp/$2$3 
else 
    echo "empty folders" $line 
fi 
done 

파일 docs.txt는 다음과 같이 나열된 폴더의 집합입니다 :

은 내가 지금까지 무엇을 가지고 있습니다),/temp/디렉토리로 이동합니다.

하지만 "날짜 + % d % m % Y % H % M % S"문자열을 추가하는 중입니다. 이름 바꾸기 문자열에 정상적으로 추가 할 수있는 방법이 없습니다.

$ (날짜)를 추가하면 추가 형식을 무시합니다. 를 덧붙이 예

'는에게 S를 바꾸려면, (^ | /.) ([^ /])/([^/*) $/TMP/$ 2 $ 3 $ (일자) 가 파일명을 준다 "4 24 35 20 48 111 123 321 folderplacement_filename.ext"

내가 원하는 같은 파일은 "folderplacement_filename11102017011632.ext"같이합니다합니다 (.ext를도 확인 후 날짜를 추가.)

이것은 아마도 내가 옳은 방식으로 인용하거나 대괄호로 묶어야 할 것이지만, 나는 그것을 이해할 수 없다.

답변

0

이름 바꾸기에 대한 경험이 없지만 해당 줄 끝에 따옴표가 누락되었습니다.

작은 따옴표를 사용하는 경우 셸은 변수를 확장하지 않습니다. 즉, 명령 인수의 마지막 부분은 실제로는 $(date)이며 원하는 것은 아닙니다. 큰 따옴표를 사용할 수는 있지만 $을 모두 백 슬래시로 이스케이프 처리해야합니다. 또는 날짜 부분을 작은 따옴표 바깥에 넣을 수도 있습니다 (예 :

)
now=$(date +%d%m%Y%H%M%S) 
find $line -type f | rename 's:(^|.*/)([^/]*)/([^/]*)$:/tmp/$2$3'$now 
+0

고마워요! 이것은 나를 올바른 길로 인도한다. 나는 그것을 다음과 같이 큰 따옴표로 묶어서 해결했다. $ [es : rename] s : (^ |. * /) ([^ /] *) ([^ /] *)/([^ /] *) \ $ :/tmp/$ now \ _ \ $ 2 \ $ 3 \ $ 4 : "누락 된 부분을 찾아내는 것이 옳습니다."이것은 스크립트에서 찾을 수없는 오타였습니다. – Stian