Я намагаюся замінити 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 для відповіді № 1sed
призначений для пошуку та заміни файлів і ні на каталоги в 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"`