将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?将with Nothing替换%2F为 ' /'、dir=noting 并file=with 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如果您喜欢屏幕上看到的内容,请删除这两个命令。

相关内容