Рекурсивное удаление префикса из файлов в ssh - PullRequest
1 голос
/ 06 мая 2020

У меня есть множество папок с изображениями (много!), И некоторые из эскизов имеют префикс 'tn', а другие нет, поэтому, чтобы иметь возможность написать галерею для всех, я попытка удалить 'tn' из начала файлов, которые имеют его рекурсивно во всем каталоге.

Итак, неправильный эскиз будет иметь файлы:

tngal001-001.jpg
tngal001-002.jpg
tngal001-003.jpg

et c ...

и мне нужно, чтобы они были:

gal001-001.jpg
gal001-002.jpg
gal001-003.jpg

или еще лучше ... если бы я мог снять весь tngal001-, это было бы потрясающе, Итак, в каталоге gallery у меня есть:

gal001/thumbnails/tngal001-001.jpg
gal001/thumbnails/tngal001-002.jpg
gal001/thumbnails/tngal001-003.jpg 
etc...

gal002/thumbnails/tngal002-001.jpg
gal002/thumbnails/tngal002-002.jpg
gal002/thumbnails/tngal002-003.jpg 
etc...

gal003/thumbnails/tngal003-001.jpg
gal003/thumbnails/tngal003-002.jpg
gal003/thumbnails/tngal003-003.jpg 
etc...

, и я бы предпочел:

gal001/thumbnails/001.jpg
gal001/thumbnails/002.jpg
gal001/thumbnails/003.jpg 
etc...

gal002/thumbnails/001.jpg
gal002/thumbnails/002.jpg
gal002/thumbnails/003.jpg 
etc...

gal003/thumbnails/001.jpg
gal003/thumbnails/002.jpg
gal003/thumbnails/003.jpg 
etc...

Я пробовал find . -type f -name "tn*" -exec sh -c 'for f; do mv "$f" "{f#tn}"; done' find sh {} +

и find . -type f -exec sh -c 'for file in tn*; do mv "$file" "${file#tn}"; done' findsh {} +

но я не совсем понимаю. Я просто хочу понять, как рекурсивно удалять буквы / переименовывать, так как я просто разбираюсь в этом материале. Все остальные вопросы, которые я нашел, похоже, касаются удаления символов из имен файлов, а все символы ascii и экранирующие пробелы et c сбивают меня с толку. Я был бы признателен, если бы кто-нибудь мог объяснить это просто (i sh) engli sh. Я не дурак, но я новичок от ie до linux! Я понимаю, что все это логично, когда я понимаю, что происходит.

Заранее спасибо, Кирсти

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

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

Предполагая, что у вас есть структура папок как

gallery/
gallery/gal001
gallery/gal002
gallery/gal003
...
gallery/gal001/thumbnails/
gallery/gal002/thumbnails/
gallery/gal003/thumbnails/
...
gallery/gal001/thumbnails/tngal001-001.jpg
gallery/gal001/thumbnails/tngal001-002.jpg
gallery/gal001/thumbnails/tngal001-002.jpg

Переместить в свой gallery, используя cd gallery, затем запустите следующий код

for j in *;
 do
    cd $j/thumbnails; 
    for i in  *; 
     do 
       echo "Renaming $j/thumbnails/$i --> $(echo $i|sed "s/tn$j-//1")";
       mv -i $i $(echo $i|sed "s/tn$j-//1"); 
     done
    cd ../..; 
done

Объяснение

for j in *;

перебирает все папки в gallery ie j содержит gal001, gal002, gal003, etc.

cd $j/thumbnails; 

перемещается в директорию 'gal001 / thumbnail'.

for i in  *; do 

перебирает все файлы в каталоге gal001/thumbnails и имя файл содержится в i.

echo "Renaming $j/thumbnails/$i --> $(echo $i|sed "s/tn$j-//1")"

Печатает имя файла, в который он переименовывается. (Удалите его, если не хотите подробностей).

mv $i $(echo $i|sed "s/tn$j-//1"); done

mv -i $i newname Переименовывает $i (значение текущего файла в l oop). -i флаг для запроса, если имя файла после переименования уже существует.

sed - это редактор потока, переносит filename by конвейер $i в sed,

"s/previous/new/1" заменяет первое появление значения previous на значение new в потоке. Здесь заменяет значение tn + j (которое является именем каталога gal001), т.е. tngal001- на «пустую строку» (ничего между //).

cd ../.. для перемещения вернуться к gallery.

0 голосов
/ 06 мая 2020
find . -type f -name "tn*" -exec sh -c '
  for f; do
    fname=${f##*/}
    mv -i -- "$f" "${f%/*}/${fname#tn*-}"
  done
' sh {} +

Вам нужно разделить "$f" на родительский путь и имя файла, прежде чем вы начнете удалять префикс из имени файла. И вы забыли добавить $ в расширение вашего параметра (${f#tn}).

  • ${f##*/} удаляет самый длинный префикс */ и оставляет имя файла, например

    gal001/thumbnails/tngal001-001.jpg -> tngal001-001.jpg
    

    (тот же результат, что и basename "$f")

  • ${f%/*} удаляет самый короткий суффикс /* и оставляет родительский путь, например

    gal001/thumbnails/tngal001-001.jpg -> gal001/thumbnails
    

    (тот же результат, что и dirname "$f")

  • ${fname#tn*-} удаляет самый короткий префикс tn*- из имени файла, например

    tngal001-001.jpg -> 001.jpg
    

Я добавил опцию -i, чтобы запросить перезапись уже существующего файла.

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