Файлы с полным путем в одинарных кавычках в текстовом файле не могут быть использованы для обработки цикла - PullRequest
0 голосов
/ 16 октября 2019

У меня есть тестовый файл, который содержит разделенные пробелами файлы, которые я хочу переместить / удалить.

Пример строки:

'/data/owncloud/A0934095JG 1231/files/Photos/Paris 2016 08 28.jpg'

Я хочу переместить файлы в другоекаталог в цикле for:

for i in $(cat marktodelete);do mv $i /data/willbedeleted/;done

Но это дает мне ошибку.

mv: cannot stat ‘'/data/owncloud/A0934095JG 1231/files/Photos/Paris 2016 08 28.jpg'’: No such file or directory

Почему?

2-я проблема после этого, как я мог на самом деле переместить этот файлна новое место с включенным в имя оригинальным каталогом, как показано в приведенном выше файле, как на новом месте:

/data/willbedeleted/Paris 2016 08 28.jpg-/data/owncloud/A0934095JG 1231/files/Photos/ 

или из-за косой черты может быть так же, без проблем

/data/willbedeleted/Paris 2016 08 28.jpg-data-owncloud-A0934095JG-1231-files-Photos

1 Ответ

1 голос
/ 16 октября 2019

Отвечая на 1-й вопрос, есть две проблемы, связанные с пробелами в имени пути. Один находится в цикле for .. in .., а другой - в команде mv. Расщепление слов вызывается, если вы не заключите двойные кавычки в имена файлов. С другой стороны, если вы заключаете имена файлов в кавычки в файле ресурсов marktodelete, символ цитирования интерпретируется как часть имени файла.

Если в одной строке файла содержится одно имя файла, попробуйтевместо этого:

while IFS= read -r i; do
    i=${i#\'}    # remove leading single quote
    i=${i%\'}    # remove trailing single quote
    mv -- "$i" /data/willbedeleted/
done < marktodelete

Что касается 2-го вопроса, вы можете изменить имена файлов назначения с помощью:

while IFS= read -r i; do
    i=${i#\'}    # remove leading single quote
    i=${i%\'}    # remove trailing single quote
    basename="${i##*/}"     # extracts filename
    orgdir="${i%/*}"        # extracts directory name
    newname="${basename}-${orgdir//[\/ ]/-}"
    mv -- "$i" "/data/willbedeleted/$newname"
done < marktodelete

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...