Как я удаляю файлы с пробелами в них в сценарии удара?

Не полностью уверенный, что Вы спрашиваете...

Скажите, что у Вас есть псевдоним SSH для 'mainserver', таким образом, можно сделать ssh mainserver. Если Вы хотите, чтобы это также работало на ping mainserver, необходимо вставить псевдоним /etc/hosts, как так:

/etc/hosts:

192.168.0.1 comp-one
192.168.0.2 comp-two

192.168.0.20 mainserver

Затем Вы могли сделать ping mainserver и это проверило бы с помощью ping-запросов 192.168.0.20.

1
22.04.2014, 18:36
4 ответа

Всегда заключайте свои замены в кавычки. Не добавляйте побочные кавычки к своим строкам.

foo="${file#...}"
bar="${file%...}"
baz="$file"
1
27.01.2020, 23:38
  • 1
    Кстати, присвоения с расширением (поскольку Вы показываете здесь) являются одним местом, где кавычки являются дополнительными... –  gniourf_gniourf 07.12.2013, 20:59
  • 2
    В то время как это - хороший совет, и отсутствие кавычек вокруг замены является, вероятно, причиной проблемы (я не отсеял посредством блуждания, плохо отформатированный, твердый для следования вопрос видеть точно, где проблема), Вы выбрали одно место, где кавычки не необходимы. Вам не нужны двойные кавычки в местах, где оболочка ожидает отдельное слово, такой как в присвоении или после case. –  Gilles 'SO- stop being evil' 09.12.2013, 00:16

Ваш вопрос чрезвычайно долог и труден следовать. Вот некоторые ошибки, которые я поймал, могут быть другие.

do read FILENAME;

Это разделяет пробел вначале и конец строки, и выполняет расширение обратной косой черты (таким образом, все обратные косые черты удалены кроме после другой обратной косой черты). Для обработки одной строки буквально использовать

do IFS= read -r FILENAME

Настоящая проблема, с которой Вы сталкиваетесь, является, вероятно, этим:

rm "\"${differentquotes}\""

Вы добавляете символ " перед именем файла и символом " после имени файла. Вы говорите rm удалить файл, имя которого начинается и заканчивается a " символ. Вы, вероятно, означали удалять файл, имя которого является значением переменной differentquotes (чье имя не отражает свое значение). Удалить файл, имя которого является значением переменной differentquotes, использовать

rm -- "$differentquotes"

( -- то, в случае, если аргумент начинается -; это не необходимо с кодом, который Вы показываете здесь с тех пор find всегда распечатывает имена, которые не начинаются - и если я считал Ваше преобразование правильно, оно не рискует представлять то.)

Основное правило правильно обработать имена файлов с пробелом и другими специальными символами состоит в том, чтобы всегда помещать двойные кавычки вокруг замен команды и переменной. Это "$foo" — кавычки являются частью синтаксиса оболочки. Если Вы имеете \" где-нибудь, это делает " характерная роль строки вместо части синтаксиса оболочки.

После этого Вы, кажется, попытались удалить пробелы и вставить их назад. Вы сделали ту же ошибку добавления побочных символов кавычки в том, что Вы используете в качестве имени файла. Кроме того, Вы не можете отложить пробелы, которые Вы удалили — Вы не знали бы сколько пробелов возвращаться или где.

1
27.01.2020, 23:38

Это должно сделать это. Заметьте двойные кавычки вокруг переменных, представляющих имена файлов с пробелами. Обязательно замените .mp3 любым расширением, которое Вы хотите.

#!/bin/bash

LOCATION="/path/to/file"
for FILE in $LOCATION/*; do
  if [[ $FILE == *.mp3 ]]; then
    NEWNAME=`echo $FILE | tr '\ ' _`
    echo "File name was ${FILE}. File name without spaces is $NEWNAME"

    #uncomment this next line to move the file to the new name without spaces
    mv "$FILE" $NEWNAME

    #uncomment this next line if you want to instead remove the file
    #rm "$FILE"

  fi
done
0
27.01.2020, 23:38
  • 1
    за взятие Вас время для фактического чтения моего кода для наблюдения, что продолжалось. даже мысль, я выяснил другой способ сделать это с тремя строками кода в цикле, поскольку я добавил его к остальной части моего фильтра сценария =" $ {приставка}. $ {расширение}" mv "$killfile" "$ {фильтр//*/killme.k}" комната "killme.k" –  uxserx-bw 07.12.2013, 22:35
  • 2
    Без проблем. Если Вы не должны переименовывать файл сначала, Вы могли бы также решить его с находкой.-maxdepth 1 - тип f - называет '* *' - удаляют –  nyxgeek 07.12.2013, 23:04
  • 3
    я использую ffmpeg для преобразования mp3s к 128K, дающему им новое имя с символами нижнего подчеркивания для замены всех пробелов и спама между именами в файле, затем делая каталоги согласно там метаданным альбома художника, затем помещая их в упомянутые каталоги. У меня просто была та проблема избавления от старого файла из-за всех пробелов и спама между именами художника и такого. теперь это работает большое и преобразовывает, помещая новый mp3, где они должны быть и избавление от старого файла, в то время как я просто сижу, здесь думая о чем-то еще для записи в сценарии удара :D Спасибо! –  uxserx-bw 07.12.2013, 23:28
  • 4
    Можно избавиться от if оператор, если Вы используете for FILE in $LOCATION/*.mp3 –  glenn jackman 18.12.2013, 20:29

Шаги, которые я сделал, находятся в комментариях ниже:

  # rename old file regardless of how messes up or not
  # it is using basename to get information needed 
      killfile="${pref}.${ext}"
  # copy old file name to a different file name
  # using the mv command
  # mv ${old file name.ext} ${oldfile name//search pattern/replace with] 
  # gives you a new file with what ever you named it
      mv "$killfile" "${killfile//*/killme.k}" 
  #the then just delete it
             rm "killme.k"

Путем выполнения его этот путь I, нашел, что система будет видеть его таким образом, это устранило мой файл, не добираясь no such file or directory error - то, что я добирался.

0
27.01.2020, 23:38

Теги

Похожие вопросы