index.php?dir=foo/bar/&file=bar2.jpg를 foo/bar/bar2.jpg로 추출합니다.

index.php?dir=foo/bar/&file=bar2.jpg를 foo/bar/bar2.jpg로 추출합니다.

다음과 같은 이름을 가진 파일이 많이 있습니다.

index.php?dir=IOP%2FFOO%2FBAR%2F&file=ScanImage001.jpg

index.php?%2FNothing을 ' /' 로 바꾼 후 다음 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화면에 표시되는 내용이 마음에 들면 이 두 명령을 제거하십시오.

관련 정보