Почему этот сценарий не работает?

Я использую этот скрипт:

for i in $(ls); do mv $i a$i; done

для добавления всех имен файлов в папку с буквой a. Я боюсь, что в какой-то момент я случайно использую этот скрипт в неправильном каталоге и добавлю кучу имен файлов, которые я не хочу добавлять. Поэтому я решил явно указать путь к файлу. Так что теперь мой скрипт выглядит так:

for i in $(ls /cygdrive/c/Users/path/to/Images); do mv /cygdrive/c/Users/path/to/Images/$i /cygdrive/c/Users/path/to/Images/a$i; done

Он предваряет имя файла буквой a, но также добавляет имя файла с этим символом.

любые идеи, почему это будет делать?

Если это помогает, я использую cygwin на Windows 7 box.

Спасибо за помощь!

4
задан Devin
05.04.2023 19:01 Количество просмотров материала 3117
Распечатать страницу

3 ответа

никогда не анализировать вывод 'ls'. Сделайте это вместо:

for i in *; do mv "$i" "a${i}"; done

причина в том, что в именах файлов могут быть такие символы, как \r или \n, и разбор " ls " не найдет их.

Update: полезная информация по этой ссылке: http://mywiki.wooledge.org/ParsingLs

С выше добавлена информация от ОП, то так:

for i in /cygdrive/c/Users/path/to/Images/*; do mv "$i" "${i%/*}/a${i##*/}"; done

ЭТО СДЕЛАЕТ ОДНУ ОТНОСИТЕЛЬНО ПЛОХУЮ ВЕЩЬ... он переименует все файлы, каждый время вам запустить его. Это означает, что файл 'foo' будет 'afoo'. Когда вы запустите его снова, это будет "aafoo", затем "aaafoo" и т. д. Вы можете запрограммировать это, избегая любых файлов, которые начинаются с 'a' , но это позволит избежать всех файлов, начинающихся с 'a', даже если они еще не были переименованы в сценарии.

3
отвечен UtahJarhead 2023-04-07 02:49

проверить правильность каталога или перейти в правильный каталог (или оба):

С здесь

E_WRONG_DIRECTORY=73

TargetDirectory=/cygdrive/c/Users/path/to/Images

cd $TargetDirectory
echo "Changing names in $TargetDirectory."

if [ "$PWD" != "$TargetDirectory" ]
then    # Keep from wiping out wrong directory by accident.
  echo "Wrong directory!"
  echo "In $PWD, rather than $TargetDirectory!"
  echo "Bailing out!"
  exit $E_WRONG_DIRECTORY
fi  
1
отвечен SeanC 2023-04-07 05:06

просьба указывать ls /cygdrive/c/Users/path/to/Images Как переменная. Пожалуйста, используйте переменную как ${i} вместо $i. также использовать " " для пути .

-2
отвечен San 2023-04-07 07:23

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх