Переименование файлов с двойным l oop? - PullRequest
1 голос
/ 25 апреля 2020

У меня есть следующие 28 файлов, где я хотел бы переименовать их в

1-1
1-2
...
7-1
7-4

плюс правильное расширение файла. То, что я пробовал

for f in *; do
  for i in $(seq 7); do
    for j in $(seq 4); do
      mv $f $i-$j.${f#*.}
     done
   done
done

, но при этом переименовывается только первый файл.

Порядок, в котором они переименованы, на самом деле не имеет значения.

Вопрос

Может кто-нибудь выяснить, как переименовать файлы, чтобы они получили $j-$i наименование?

0764342e9a7b64d67b13478443cc6657.png  43fd06b017043443817df07073d76447.png  933441d5176a82b2fdd17fcecb061f76.png
1769998f64f45708ab5660453a76bcd9.png  460c50f9498171d8b3b13415692ba744.png  9638e66b9c7ad1a958a12dcb19918e82.png
1f32eab75790c4ec79dfeeb363381351.jpg  4ba8abdc7e43864ec79d432e9c259ff5.png  9d28f3c61dca4daaecc7f257b4ee09be.jpg
237b4de6ee17bb5033d7b17660ceef75.png  5b09795f9eef920da1207b2549cd5d80.png  c1d0c1520d62a811f9de297eecc08235.png
288ac636a508b903ef1d5c8c914a531c.png  60eff92e2dcf2192449c47fdb94551a1.jpg  e2080072a8615f3016046f396ccba40f.png
2aeddcc1c52b32d81331c4be957bbfa4.png  6960cdb5cc9951e96f4a95aba44f9377.jpg  e2d25004b63c60f83b690d3394277d4d.jpg
2b9f5508623ef64f8f0e81ae6bb1fb24.png  6ab9951011bad2bed060658ac58ea7c1.png  e6989ec43b8fcab262b6a414313b6538.png
36f4a71039adaffdd3e173ab302e5142.png  6b0f52f96bce76c004be0a3d70e2ef3f.png  e8e7f53b39b632427333d700f34b2c5b.png
392da2e9809cca9d9357b3d1f4868de1.jpg  6c8a9665ee8a3e251bad53748815cedd.png
3e7bfa5919f5d49d3dfc27574f346337.png  8fd5ec47f3d31844be60c1350361905e.jpg

Ответы [ 2 ]

5 голосов
/ 25 апреля 2020

Вы можете создать массив, содержащий новые префиксы, а затем l oop над именами файлов и извлечь соответствующий элемент массива.

# the convoluted way to create the array (don't use it, see below)
fnames=()
for i in {1..7}; do
  for j in {1..4}; do
     fnames+=("$i-$j")
  done
done

# the short way using two brace expansions, credits go to @Benjamin W.
fnames=({1..7}-{1..4})

idx=0
for f in *; do
  mv "$f" "${fnames[idx++]}.${f#*.}"
done
2 голосов
/ 25 апреля 2020

Создание двух псевдофайлов, вставка их вместе и использование sed для преобразования каждой строки в команду:

paste <(printf '%s\n' *) <(printf '%s\n' {1..7}-{1..4}) \
    | sed 's/^/mv /;s/\(\....\)\(.*\)/\1\2\1/' \
    | bash

Вывод команды paste выглядит примерно так:

$ paste <(printf '%s\n' *) <(printf '%s\n' {1..7}-{1..4})
0764342e9a7b64d67b13478443cc6657.png    1-1
1769998f64f45708ab5660453a76bcd9.png    1-2
1f32eab75790c4ec79dfeeb363381351.jpg    1-3
237b4de6ee17bb5033d7b17660ceef75.png    1-4
288ac636a508b903ef1d5c8c914a531c.png    2-1
2aeddcc1c52b32d81331c4be957bbfa4.png    2-2
2b9f5508623ef64f8f0e81ae6bb1fb24.png    2-3
36f4a71039adaffdd3e173ab302e5142.png    2-4
392da2e9809cca9d9357b3d1f4868de1.jpg    3-1
3e7bfa5919f5d49d3dfc27574f346337.png    3-2
<snip>

и так далее; Сед превращает это в

mv 0764342e9a7b64d67b13478443cc6657.png 1-1.png
mv 1769998f64f45708ab5660453a76bcd9.png 1-2.png
mv 1f32eab75790c4ec79dfeeb363381351.jpg 1-3.jpg
mv 237b4de6ee17bb5033d7b17660ceef75.png 1-4.png
mv 288ac636a508b903ef1d5c8c914a531c.png 2-1.png
mv 2aeddcc1c52b32d81331c4be957bbfa4.png 2-2.png
mv 2b9f5508623ef64f8f0e81ae6bb1fb24.png 2-3.png
mv 36f4a71039adaffdd3e173ab302e5142.png 2-4.png
mv 392da2e9809cca9d9357b3d1f4868de1.jpg 3-1.jpg
mv 3e7bfa5919f5d49d3dfc27574f346337.png 3-2.png
<snip>

, а конвейер до bash запускает его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...