앞으로 도움이 될 수 있기를 바랍니다. 이들은 직장에서 리눅스 관리자로부터 온 것입니다. 이 손톱에 얼마나 많은 망치가 작동하는지 보여주십시오!
안녕 덴햄,
예를 들어 "XXX Season #"을 가진 디렉토리의 일부는 항상 "외부"디렉토리 (리프 노드)가 될 것이라고 가정합니다.
어쨌든 작은 스크립트를 작성합니다. 이와 같은 것이 작동해야합니다 (디렉토리의 모든 공간을 캡처하려면 변수 주위에 큰 따옴표를 유의하십시오).
find /media/Expansion2/Series/ -type d | while read olddir
do
newdir=`echo "${olddir}" | awk -F "/" '$NF ~ /Season/ { last=substr($NF,index($NF, "Season")); while (i<(NF-1)) { i++; printf("/%s", $i) }; printf("/%s\n", last) } $NF !~ /Season/ { print }'`
if [ "${olddir}" != "${newdir}" ]
then
mv "${olddir}" "${newdir}"
fi
done
물론, "mv"$ {olddir} ""$ {newdir} ""명령으로 실행하기 전에 "echo"$ {olddir} ""$ {newdir} ""과 같은 것을 넣어야합니다. 예상 한 결과를 얻거나 다른 두통으로 끝날 수 있습니다 :-P
안녕 덴햄,
대부분의 답변은 이미 문제에있었습니다. 어쨌든 Series 폴더에서 다음과 같은 것을 실행하면 정상적으로 작동합니다.
find -mindepth 2 -maxdepth 2 -type d | while read dir; do mv -T "$dir" "`dirname "$dir"`/`basename "$dir" | sed "s/.*Season \([0-9]*\)$/Season \1/i"`"; done
설명 :
• find -mindepth 2 -maxdepth 2-타입 d (디렉토리를 두 레벨 아래로 나열)
• dir을 읽는 동안; (각 디렉토리에 루프)
• mv -T "$ dir"(소스 디렉토리를 다음으로 이동 : -T는 계절 폴더가 고유하지 않은 경우 오류가 발생하는 데 필요합니다. 즉 "빅뱅 이론 시즌이없는 경우" 동일한 디렉토리의 22 "및"Season 22 ")
• dirname"$ dir "은 dir이있는 경로를 반환합니다.
• basename"$ dir "은 디렉토리의 이름을 반환합니다
. • sed"s /. Season ([0-9] ) $ / Season \ 1 / i "는 대소 문자를 구분하지 않는 정규 표현식으로 마술을 완성합니다.
내 작은 테스트에서 효과가있었습니다 (mv 전에 에코로 먼저 시도하십시오).
someuser@linux-box:/tmp/Series$ find
.
./The Big Bang Theory
./The Big Bang Theory/Season 2
./The Big Bang Theory/Season 2/file1.avi
./The Big Bang Theory/Season 2/file 3.avi
./The Big Bang Theory/Season 2/file2.avi
./The Big Bang Theory/Season 2/file
./The Big Bang Theory/Season 2/3.avi
./The Big Bang Theory/The Big Bang Theory Season 1
./The Big Bang Theory/The Big Bang Theory Season 1/file1.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file 3.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file2.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file
./The Big Bang Theory/The Big Bang Theory Season 1/3.avi
./Other Series
./Other Series/Season 2
./Other Series/Stre dsfdf sd dSeason 3
someuser@linux-box:/tmp/Series$ find -mindepth 2 -maxdepth 2 -type d | while read dir; do mv -T "$dir" "dirname "$dir"
/basename "$dir" | sed "s/.*Season \([0-9]*\)$/Season \1/i"
"; done
mv: ./The Big Bang Theory/Season 2' and
./The Big Bang Theory/Season 2' are the same file
mv: ./Other Series/Season 2' and
./Other Series/Season 2' are the same file
someuser@linux-box:/tmp/Series$ find
.
./The Big Bang Theory
./The Big Bang Theory/Season 2
./The Big Bang Theory/Season 2/file1.avi
./The Big Bang Theory/Season 2/file 3.avi
./The Big Bang Theory/Season 2/file2.avi
./The Big Bang Theory/Season 2/file
./The Big Bang Theory/Season 2/3.avi
./The Big Bang Theory/Season 1
./The Big Bang Theory/Season 1/file1.avi
./The Big Bang Theory/Season 1/file 3.avi
./The Big Bang Theory/Season 1/file2.avi
./The Big Bang Theory/Season 1/file
./The Big Bang Theory/Season 1/3.avi
./Other Series
./Other Series/Season 3
./Other Series/Season 2