Передача переменных в cp / mv - PullRequest
0 голосов
/ 08 июля 2019

Я могу использовать команду cp или mv для копирования / mv файлов в новую папку вручную, но в цикле for это не получается.

Я пробовал разные способы сделать это, но ни один из них не работает. Самое неприятное то, что он работает при локальном запуске.

Простая версия того, что я пытаюсь сделать, показана ниже:

#!bin/bash

#Define path variables
source_dir=/home/me/loop
destination_dir=/home/me/loop/new

#Change working dir
cd "$source_dir"

#Step through source_dir for each .txt. file
for f in *.txt
  do
    # If the txt file was modified within the last 300 minutes...
    if [[ $(find "$f" -mmin -300) ]]
    then
    # Add breaks for any spaces in filenames
    f="${f// /\\ }"
    # Copy file to destination
    cp "$source_dir/$f $destination_dir/"
    fi
  done

Сообщение об ошибке:

cp: missing destination file operand after '/home/me/loop/first\ second.txt /home/me/loop/new/'
Try 'cp --help' for more information.

Однако я могу запустить вручную:

mv /home/me/loop/first\ second.txt /home/me/loop/new/

и работает нормально. Я получаю ту же ошибку, используя cp, и аналогичные ошибки, используя rsync, поэтому я не уверен, что делаю неправильно ...

Ответы [ 2 ]

2 голосов
/ 08 июля 2019
cp "$source_dir/$f $destination_dir/"

Когда вы заключаете оба аргумента в двойные кавычки, вы превращаете их в один аргумент со встроенным пробелом. Цитируйте их отдельно.

cp "$source_dir/$f" "$destination_dir/"

Там нет ничего особенного для пробелов заранее. Цитирование уже гарантирует, что файлы с пробелами обрабатываются правильно.

# Add breaks for any spaces in filenames
f="${f// /\\ }"

Давайте сделаем шаг назад. Перебирать все файлы *.txt, а затем проверять каждый из них с помощью find слишком сложно. find уже зацикливается на нескольких файлах и выполняет произвольные действия с этими файлами. Вы можете сделать все в этом сценарии одной командой find.

#!bin/bash

source_dir=/home/me/loop
destination_dir=/home/me/loop/new

find "$source_dir" -name '*.txt' -mmin -300 -exec cp -t "$destination_dir" {} +
1 голос
/ 08 июля 2019

Вам нужно разделить его на две строки, например:

cp "$source_dir/$f" "$destination_dir/"

, имея в качестве одного, вы в основном говорите cp, что вся строка является первым параметром, где на самом деле это два (sourceи пункт назначения).

Редактировать: Как утверждают @ kamil-cuk и @aaron, есть лучшие способы сделать то, что вы пытаетесь сделать.Пожалуйста, прочитайте их комментарии

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