/ / sed замінити пробіли в назвах каталогів - bash, macos, sed

sed замінити пробіли в іменах каталогів - bash, macos, sed

Я намагаюся замінити space з - в каталог імена, а не файл імена на macOS. У мене є таке:

cd ~/foo
for directory in **; do
if [[ -d $directory ]] && [[ -w $directory ]]; then
sed -i "" "s/  /-/g" "$directory"
fi
done

Однак я отримую помилку in-place editing only works for regular files.

Як я можу замінити пробіли в іменах каталогу?

Відповіді:

3 для відповіді № 1

sed призначений для пошуку та заміни файлів і ні на каталоги в Linux / Unix. The -i прапор в sed використовується для заміни тексту під час файлу, дія просто не має сенсу для каталогу. Ви, ймовірно, мали намір змінити ім'я каталогу за допомогою sed на ім'я файлу та з часом використовувати mv перейменувати фактичний каталог із заміненим рядком.

Але ви могли просто скористатися mv в першу чергу з оболонками нативної оболонки, щоб замінити пробіл на a - характер

for directory in **; do
if [[ -d $directory ]] && [[ -w $directory ]]; then
mv -- "$directory" "${directory// /-}"
fi
done

0 для відповіді № 2

Для перейменування каталогу необхідно використовувати команду mv

#!/bin/bash

cd foo
for directory in **; do
if [[ -d $directory ]] && [[ -w $directory ]]; then
newdir=`echo "$directory" |sed  "s/ /-/g" `
if [ "$directory" -ne "$newdir" ]
mv -- "$directory" "$newdir"
fi
fi
done

-1 для відповіді № 3

sed є універсальним, але я пропоную використовувати більш спеціалізований інструмент, такий як rename:

rename "s/ /-/g" "$directory"

Також ви дуже спробуєте перейменувати вже перейменовані каталоги (і, отже, вже не існувати). Я пропоную вам скористатися find варіанти -depth (глибина перша) і -execdir (виконати команду всередині каталогу, щоб не впливати на батьківські каталоги):

find foo -depth -type d -execdir rename "s/ /-/g" {} +

-1 для відповіді № 4
directory=`echo $directory | sed "s/ /-/g"`