Вывод, который я получаю через работы “эха” как команда при вставке к терминалу, но не в сценарии

Гну ls обеспечивает -x опция достигнуть этого.

3
13.04.2017, 15:37
3 ответа

Главная проблема в том, что вы зацикливаете выход команды ls. Используйте вместо этого глобус *:

#!/bin/sh
cd ~/Data
for i in *; do
    echo "$i"
    filename="$i"
    date=$(date -n +%Y-%m-%d)
    new_filename="${date}${filename}"
    echo mv "${filename}" "${new_filename}"
    mv -- "${filename}" "${new_filename}"
done

Дополнительно я добавил -- в mv, чтобы правильно обрабатывать файлы, имена которых начинаются с -. А в моей команде - нет опции -n, но я оставляю ее, так как у вас может быть другая версия.

5
27.01.2020, 21:16

Вам просто нужно обработать имя файла, добавив escape caracter \ перед космосом.

filename=$(echo $i|sed 's/ /\\ /g')
mv $filename $new_filename
-1
27.01.2020, 21:16

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

Вот как я переписал ваш фрагмент.

#!/bin/bash
cd ~/Data
date="$(date -n +%Y-%m-%d)"

for filename in *; do
    echo "${filename}"
    new_filename="$date$filename"
    filename_e="$(echo "$filename"|sed -e 's!\('\''\)!\\\1!')"
    new_filename_e="$(echo "$new_filename"|sed -e 's!\('\''\)!\\\1!')"
    echo mv -- \'"${filename_e}"\' \'"${new_filename_e}"\'
    mv -- "${filename}" "${new_filename}"
done;

Эта версия будет правильно переименовать любой файл с любым символом в имени. Единственное ограничение заключается в том, что команда ECHOED может производить команды, которые не работают в файлах, которые имеют новую строку в имени.

1
27.01.2020, 21:16

Теги

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