Скопируйте файлы из одной папки в другую, но интервал между каждым файлом

В соответствии с вашим разговором с @steeldriver в комментариях, я предполагаю, что ваш пользователь не вышел из системы.

Самый простой способ убедиться, что supersecretuser вышел из системы, - это ввести

При этом я получаю вывод следующим образом:

mitch@quartz:~$ who
mitch    :0           2014-09-08 09:49 (:0)
mitch    pts/0        2014-09-08 13:18 (:0.0)

Я вижу только себя. Аналогично, набрав w в терминал, покажет мне, кто все зарегистрирован и что они делают:

USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
mitch    :0       :0               09:49   ?xdm?  29:08   0.11s init --user
mitch    pts/0    :0.0             13:18    5.00s  0.06s  0.01s w

Вы можете остановить другого пользователя (SSU, который я назову его), с помощью следующая команда:

pkill -STOP -u SSU

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

7
задан 25 May 2018 в 22:27

6 ответов

Единые командные решения

Среди многих опций, включая циклы, которые используют cp и sleep, мы могли бы выбрать find с двумя флагами -exec для выполнения этих точных команд.

find ~/dir_1/ -type f -maxdepth 1  -exec cp {} ~/dir_2 \;  -exec sleep 1   \;

Здесь указаны следующие опции:

~/dir_1, каталог происхождения, через который работает find. -type f получить только файлы -maxdepth 1 спускаться вниз на 1 уровень максимум в дереве каталогов; предотвращает спуск в подкаталоги -exec cp {} ~/dir_2 \; копировать текущий обработанный файл, назначенный параметром {}, на ~/dir_2. [F19] обозначает cp для обработки отдельного файла за раз, вместо того, чтобы вставлять как можно больше файлов в {}. Обратная косая черта в \; необходима, чтобы предотвратить неверное истолкование оболочки в качестве терминатора команд. exec sleep 1 \; выполняет sleep 1 за каждый текущий файл.

Если у вас есть список файлов в файле, вы можете сделать:

xargs -I % --arg-file=input.txt sh -c 'cp % ~/dir_2/ ;sleep 1'

Параметры здесь:

~/dir_1, исходный каталог, с помощью которого работает find. --arg-file=input.txt читать аргументы для команды из определенного файла -type f получать только файлы

Loop solutions

]

Вы можете использовать цикл for, например

for f in "/path/to/folder_1"/*; do
    cp "$f"  "/path/to/folder_2/"
    sleep 1
done

. Для ясности это отформатировано на нескольких строках, но это работает как одна строка так же хорошо. Вы могли бы также превратить это в функцию:

delaycp(){
    for f in "$1"/*; do
        cp "$f"  "$2"/
        sleep 1
    done
}

И использовать его как

delaycp "/path/to/folder1" "/path/to/folder2"

В качестве альтернативы, если вы хотите скопировать только определенные файлы, а не все, что * glob захватывает в каталоге, вы всегда можете использовать расширение пути, что-то вроде file{1..25} или иметь входной текстовый файл, что-то вроде этого input.txt:

/path/to/folder_1/file1
/path/to/folder_1/file2
/path/to/folder_1/file3

И оттуда использовать структуры while IFS= read -r line для чтения файла:

while IFS= read -r line || [ -n "$line" ]; do
    cp "$line" "/path/to/folder_2/${line##*/}"
    sleep 1
done < input.txt
10
ответ дан 8 June 2018 в 13:55
  • 1
    Что такое " или " в вашем while цикле? – Dennis Williamson 26 May 2018 в 00:05
  • 2
    @DennisWilliamson дополнительную защиту на случай, когда файл не заканчивается в [Ф1] перевод строки. Создать этот файл как пример: [Ф2]. Цикл while без этого или положение будет только [Ф3]. Почему ? Потому что "читать" построена в успехе возвращает только тогда, когда строка заканчивается [Ф4]. В [ф5], будет заканчиваться в [ф6] переменной, но [ф7] вернет не состояние выхода. Так вот почему нам нужны дополнительные проверки в случае, если переменная не пуста. – Sergiy Kolodyazhnyy 26 May 2018 в 00:11
  • 3
    В вашем разъяснении решения [Ф1], первый аргумент должен быть [Ф2] вместо [Ф3]. Вся команда правильная, просто объяснения нет. – Lienhart Woitok 26 May 2018 в 10:40
  • 4
    @LienhartWoitok Исправлено, спасибо. – Sergiy Kolodyazhnyy 26 May 2018 в 10:42

Единые командные решения

Среди многих опций, включая циклы, которые используют cp и sleep, мы могли бы выбрать find с двумя флагами -exec для выполнения этих точных команд.

find ~/dir_1/ -type f -maxdepth 1 -exec cp {} ~/dir_2 \; -exec sleep 1 \;

Здесь указаны следующие опции:

~/dir_1, каталог происхождения, через который работает find. -type f получить только файлы -maxdepth 1 спускаться вниз на 1 уровень максимум в дереве каталогов; предотвращает спуск в подкаталоги -exec cp {} ~/dir_2 \; копировать текущий обработанный файл, назначенный параметром {}, на ~/dir_2. [F19] обозначает cp для обработки отдельного файла за раз, вместо того, чтобы вставлять как можно больше файлов в {}. Обратная косая черта в \; необходима, чтобы предотвратить неверное истолкование оболочки в качестве терминатора команд. exec sleep 1 \; выполняет sleep 1 за каждый текущий файл.

Если у вас есть список файлов в файле, вы можете сделать:

xargs -I % --arg-file=input.txt sh -c 'cp % ~/dir_2/ ;sleep 1'

Параметры здесь:

~/dir_1, исходный каталог, с помощью которого работает find. --arg-file=input.txt читать аргументы для команды из определенного файла -type f получать только файлы

Loop solutions

]

Вы можете использовать цикл for, например

for f in "/path/to/folder_1"/*; do cp "$f" "/path/to/folder_2/" sleep 1 done

. Для ясности это отформатировано на нескольких строках, но это работает как одна строка так же хорошо. Вы могли бы также превратить это в функцию:

delaycp(){ for f in "$1"/*; do cp "$f" "$2"/ sleep 1 done }

И использовать его как

delaycp "/path/to/folder1" "/path/to/folder2"

В качестве альтернативы, если вы хотите скопировать только определенные файлы, а не все, что * glob захватывает в каталоге, вы всегда можете использовать расширение пути, что-то вроде file{1..25} или иметь входной текстовый файл, что-то вроде этого input.txt:

/path/to/folder_1/file1 /path/to/folder_1/file2 /path/to/folder_1/file3

И оттуда использовать структуры while IFS= read -r line для чтения файла:

while IFS= read -r line || [ -n "$line" ]; do cp "$line" "/path/to/folder_2/${line##*/}" sleep 1 done < input.txt
10
ответ дан 17 July 2018 в 13:26

Единые командные решения

Среди многих опций, включая циклы, которые используют cp и sleep, мы могли бы выбрать find с двумя флагами -exec для выполнения этих точных команд.

find ~/dir_1/ -type f -maxdepth 1 -exec cp {} ~/dir_2 \; -exec sleep 1 \;

Здесь указаны следующие опции:

~/dir_1, каталог происхождения, через который работает find. -type f получить только файлы -maxdepth 1 спускаться вниз на 1 уровень максимум в дереве каталогов; предотвращает спуск в подкаталоги -exec cp {} ~/dir_2 \; копировать текущий обработанный файл, назначенный параметром {}, на ~/dir_2. [F19] обозначает cp для обработки отдельного файла за раз, вместо того, чтобы вставлять как можно больше файлов в {}. Обратная косая черта в \; необходима, чтобы предотвратить неверное истолкование оболочки в качестве терминатора команд. exec sleep 1 \; выполняет sleep 1 за каждый текущий файл.

Если у вас есть список файлов в файле, вы можете сделать:

xargs -I % --arg-file=input.txt sh -c 'cp % ~/dir_2/ ;sleep 1'

Параметры здесь:

~/dir_1, исходный каталог, с помощью которого работает find. --arg-file=input.txt читать аргументы для команды из определенного файла -type f получать только файлы

Loop solutions

]

Вы можете использовать цикл for, например

for f in "/path/to/folder_1"/*; do cp "$f" "/path/to/folder_2/" sleep 1 done

. Для ясности это отформатировано на нескольких строках, но это работает как одна строка так же хорошо. Вы могли бы также превратить это в функцию:

delaycp(){ for f in "$1"/*; do cp "$f" "$2"/ sleep 1 done }

И использовать его как

delaycp "/path/to/folder1" "/path/to/folder2"

В качестве альтернативы, если вы хотите скопировать только определенные файлы, а не все, что * glob захватывает в каталоге, вы всегда можете использовать расширение пути, что-то вроде file{1..25} или иметь входной текстовый файл, что-то вроде этого input.txt:

/path/to/folder_1/file1 /path/to/folder_1/file2 /path/to/folder_1/file3

И оттуда использовать структуры while IFS= read -r line для чтения файла:

while IFS= read -r line || [ -n "$line" ]; do cp "$line" "/path/to/folder_2/${line##*/}" sleep 1 done < input.txt
10
ответ дан 20 July 2018 в 13:32

С parallel

Вот решение parallel, дайте аргументы parallel с ::: точно так же, как с cp, или используйте список файлов:

parallel -j1 'cp {} /path/to/dir2/;sleep 1' ::: /path/to/dir1/* # or
parallel -j1 'cp {} /path/to/dir2/;sleep 1' :::: /path/to/file_list.txt

Опция -j сообщает parallel запускать только задание 1 одновременно, а не выполнять задания параллельно, одиночные кавычки просто содержат сценарий, где {} заменяется текущим обрабатываемым файлом и ::: ] или :::: ввести список аргументов или файл (ы) соответственно. См. [F14] для гораздо большего.

С помощью find -exec

find обеспечивает удобный способ запуска команд по выводам, например. чтобы скопировать каждый файл .log в и под текущим каталогом:

find -name "*.log" -exec sh -c 'cp "$0" /path/to/dir2/;sleep 1' "{}" \;
2
ответ дан 8 June 2018 в 13:55

С parallel

Вот решение parallel, дайте аргументы parallel с ::: точно так же, как с cp, или используйте список файлов:

parallel -j1 'cp {} /path/to/dir2/;sleep 1' ::: /path/to/dir1/* # or parallel -j1 'cp {} /path/to/dir2/;sleep 1' :::: /path/to/file_list.txt

Опция -j сообщает parallel запускать только задание 1 одновременно, а не выполнять задания параллельно, одиночные кавычки просто содержат сценарий, где {} заменяется текущим обрабатываемым файлом и ::: ] или :::: ввести список аргументов или файл (ы) соответственно. См. [F14] для гораздо большего.

С помощью find -exec

find обеспечивает удобный способ запуска команд по выводам, например. чтобы скопировать каждый файл .log в и под текущим каталогом:

find -name "*.log" -exec sh -c 'cp "$0" /path/to/dir2/;sleep 1' "{}" \;
2
ответ дан 17 July 2018 в 13:26

С parallel

Вот решение parallel, дайте аргументы parallel с ::: точно так же, как с cp, или используйте список файлов:

parallel -j1 'cp {} /path/to/dir2/;sleep 1' ::: /path/to/dir1/* # or parallel -j1 'cp {} /path/to/dir2/;sleep 1' :::: /path/to/file_list.txt

Опция -j сообщает parallel запускать только задание 1 одновременно, а не выполнять задания параллельно, одиночные кавычки просто содержат сценарий, где {} заменяется текущим обрабатываемым файлом и ::: ] или :::: ввести список аргументов или файл (ы) соответственно. См. [F14] для гораздо большего.

С помощью find -exec

find обеспечивает удобный способ запуска команд по выводам, например. чтобы скопировать каждый файл .log в и под текущим каталогом:

find -name "*.log" -exec sh -c 'cp "$0" /path/to/dir2/;sleep 1' "{}" \;
2
ответ дан 20 July 2018 в 13:32

Другие вопросы по тегам:

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