Сценарий оболочки: создайте папку по текущей дате и переместите файлы .png внутри этой вложенной папки

#bash #shell

#bash #оболочка

Вопрос:

Я попытался со следующим кодом

 CUR_DATE=`date  %F`
mkdir "$CUR_DATE"
cd "$CUR_DATE"
mkdir '00UTC'
cd  ~/home/scripts/
for f in $(find . -type f -name "*.png")
do
    mv $f "~/home/scripts/${CUR_DATE}/00UTC"
done
  

Здесь все файлы * .png не перемещаются в подпапку 00UTC (которая находится внутри папки с текущей датой).
Любые предложения полезны.

Комментарии:

1. Вы создали подкаталог с буквальным именем 00UTC, и почему вы пытаетесь расширить его как переменную при использовании ${00UTC} ?

2. Кавычки bash предотвращают расширение ~/ .

3. Пожалуйста, предоставьте любое решение в деталях.

4. all *.png files does not move into Где находятся эти «все файлы * png»? В каком каталоге они находятся? В ~/home/scripts/ ?

5. ДА. Все файлы png внутри ~/home/scripts/

Ответ №1:

Кавычки bash предотвращают расширение ~/ . Я предлагаю заменить

 mv $f "~/home/scripts/${CUR_DATE}/00UTC"
  

с помощью

 mv "$f" ~/"home/scripts/${CUR_DATE}/00UTC"
  

или

 mv "$f" "$HOME/home/scripts/${CUR_DATE}/00UTC"
  

Ответ №2:

Хотя Сайрус указал на проблему, есть еще несколько вещей, которые следует учитывать, если это серьезный фрагмент кода:

  1. Первые пять строк вашего кода можно выполнить за 2, как это:

     CUR_DATE=`date  %F`
    mkdir -p "$CUR_DATE/00UTC"
      
  2. Также вы перемещаете файл png из того же каталога, поэтому нет необходимости использовать ~/ , также будет работать следующее:

     for f in $(find . -type f -name "*.png")
    do
      mv $f "$(pwd)/$CUR_DATE/00UTC"
    done
      

    или

     for f in $(find . -type f -name "*.png")
    do
      mv $f "$CUR_DATE/00UTC"
    done
      
  3. Кроме того, повторный запуск одного и того же кода приведет к появлению тех же ошибок в файлах (хотя это не приведет к искажению) при перемещении файлов, которые уже перемещены.