다음과 같은 이름을 가진 파일이 많이 있습니다.
index.php?dir=IOP%2FFOO%2FBAR%2F&file=ScanImage001.jpg
index.php?
%2F
Nothing을 ' /
' 로 바꾼 후 다음 dir=
과 file=
같이 Nothing으로 표시합니다.
IOP/FOO/BAR/ScanImage001.jpg
이제 첫 번째 파일의 이름을 두 번째 파일로 바꾸고 디렉터리를 만들고 싶습니다.
어떻게 해야 하나요?
답변1
for i in *.jpg
do
b=$(echo $i | sed 's/.*dir=//' | sed 's/%2F/\//g' | sed 's/&file=//')
mkdir -p "$(dirname "$b")
mv "$i" "$b"
done
호출이 포함된 줄 sed
에는 파일 이름을 검색해야 하는 전체 경로가 저장됩니다.
이 mkdir
줄은 중간 디렉터리를 포함한 디렉터리를 생성하고 이미 존재하더라도 불평하지 않습니다.
답변2
변수에 넣었다고 해보자.$url
short=$(echo $url | sed -e s,%2F,/,g -e s,^index[^=]*=,, -e s,.file=,,)
mkdir -p $(dirname $short)
mv $url $short
mkdir -p
디렉터리는 모든 경로와 함께 생성됩니다.$(dirname $short)
$short의 디렉토리 이름 부분을 제공합니다(예IOP/FOO/BAR
: ).
답변3
%2F
제어 문자가 아닌 리터럴 문자열인 경우 다음 작은 스크립트를 사용해 볼 수 있습니다.
for file in index*.jpg; do
dir1=$(grep -Po '.*dir=\K[[:alnum:]]*' <(echo "$file"))
dir2=$(grep -Po '.*dir=[[:alnum:]]*%2F\K[[:alnum:]]*' <(echo "$file"))
dir3=$(grep -Po '.*dir=[[:alnum:]]*%2F[[:alnum:]]*%2F\K[[:alnum:]]*' <(echo "$file"))
filename=$(grep -Po '.*file=\K.*' <(echo index.php\?dir\=IOP%2FFOO%2FBAR%2F\&file\=ScanImage001.jpg))
echo mkdir -p $dir1/$dir2/$dir3 #remove echos
echo mv $file $dir1/$dir2/$dir3/$filename #at the beginning of the line
done
echo
화면에 표시되는 내용이 마음에 들면 이 두 명령을 제거하십시오.