Скрипт для удаления письма в конце некоторых каталогов - PullRequest
1 голос
/ 22 января 2020

Предположим, у меня есть каталог с такой структурой:

enter image description here

Я делаю скрипт, который удаляет букву «х» в тех случаях, когда в конце есть один, чтобы иметь это:

enter image description here

Итак, я подумывал сделать For L oop, который идет к каждому каталога, а затем взять последнюю часть пути к папке

for d in Fruits_and_Vegetables/*/
do
     (cd "$d" && Fruit_or_Vegetable=`basename "$PWD"`)
done

Проблема в том, что я не уверен, как сказать go и взять только последний каталог

А затем, Я думал об изменении строки

echo $Fruit_or_Vegetable | awk '{print substr($1, 1, length($1)-1)}'  # substr(s, a, b) : it returns b number of chars from string s, starting at position a. 
                                                                      # The parameter b is optional, in which case it means up to the end of the string.

Проблема в том, что я не знаю, как сказать AWK, чтобы рассматривать "Moscato Giallox" как одно слово, потому что когда я выполняю команду, она возвращает "Moscat". "Giallox" вместо "Moscato Giallo" .. также, я думаю, мне нужно разместить оператор if, чтобы увидеть, является ли последняя буква x, и выполнить команду только в этих случаях.

Не могли бы вы дать мне несколько предложений, спасибо.

1 Ответ

2 голосов
/ 22 января 2020

shopt и Parameter Expansion синтаксический анализ может сделать это довольно легко. Начиная с приведенной выше структуры каталогов:

$: find @(Fruits|Vegetables)
Fruits
Fruits/Grapes
Fruits/Grapes/Muskat Grape
Fruits/Grapes/Muskat Grape/Muscat Ottonel
Fruits/Grapes/Muskat Grape/Muscato Gallox
Fruits/Mangoes
Fruits/Mangoes/Ataulfo Mango
Fruits/Mangoes/Tommy Atkins Mangox
Vegetables
Vegetables/Potatoes
Vegetables/Potatoes/Ratte Potatox
Vegetables/Potatoes/Yukon Gold Potato

Код необходимых изменений.

shopt -s extglob  # allow fancy @(...) construct to specify dirs
shopt -s globstar # add double-asterisk for flexible depth
for d in @(Fruits|Vegetables)/**/*x/ # *EDITED* - added trailing / for dirs only
do echo "mv \"$d\" \"${d%x/}/\" "   # show the command first
         mv "$d" "${d%x/}/"         # rename the dirs
done

Вывод из операторов echo:

mv "Fruits/Grapes/Muskat Grape/Muscato Gallox/" "Fruits/Grapes/Muskat Grape/Muscato Gallo/"
mv "Fruits/Mangoes/Tommy Atkins Mangox/" "Fruits/Mangoes/Tommy Atkins Mango/"
mv "Vegetables/Potatoes/Ratte Potatox/" "Vegetables/Potatoes/Ratte Potato/"

Результат :

$: find @(Fruits|Vegetables)
Fruits
Fruits/Grapes
Fruits/Grapes/Muskat Grape
Fruits/Grapes/Muskat Grape/Muscat Ottonel
Fruits/Grapes/Muskat Grape/Muscato Gallo
Fruits/Mangoes
Fruits/Mangoes/Ataulfo Mango
Fruits/Mangoes/Tommy Atkins Mango
Vegetables
Vegetables/Potatoes
Vegetables/Potatoes/Ratte Potato
Vegetables/Potatoes/Yukon Gold Potato
...