Soluções de comando único
Entre muitas opções, incluindo loops que usam cp e sleep , podemos optar por find com dois -exec flags para executar esses comandos exatos.
find ~/dir_1/ -type f -maxdepth 1 -exec cp {} ~/dir_2 \; -exec sleep 1 \;
Aqui as opções são:
-
~/dir_1, o diretório de origem, através do qualfindfunciona. -
-type fobtém apenas arquivos -
-maxdepth 1desce 1 nível máximo na árvore de diretórios; impede a descida em subdiretórios -
-exec cp {} ~/dir_2 \;copia o arquivo atualmente processado designado pelo parâmetro{}para~/dir_2. O\;designacppara processar um único arquivo por vez, em vez de colocar tantos arquivos quanto possível em{}. A barra invertida em\;é necessária para evitar que o shell interprete erroneamente isso como terminador de comando. -
exec sleep 1 \;executasleep 1por cada arquivo atual.
Se você tem uma lista de arquivos em um arquivo, você pode fazer:
xargs -I % --arg-file=input.txt sh -c 'cp % ~/dir_2/ ;sleep 1'
As opções aqui são:
-
-I %designa o símbolo que se refere ao arquivo dentro do comando -
--arg-file=input.txtlê argumentos para o comando de um arquivo específico -
sh -c 'cp % ~/dir_2/ ;sleep 1'execute/bin/shcom os comandos fornecidos por-c '...'flag;%será substituído pelo nome do arquivo.
Soluções de loop
Você poderia usar um loop for por exemplo
for f in "/path/to/folder_1"/*; do
cp "$f" "/path/to/folder_2/"
sleep 1
done
Para maior clareza, isso é formatado em várias linhas, mas também funciona como uma única linha. Você também pode transformar isso em uma função:
delaycp(){
for f in "$1"/*; do
cp "$f" "$2"/
sleep 1
done
}
E use-o como
delaycp "/path/to/folder1" "/path/to/folder2"
Alternativamente, se você deseja copiar apenas certos arquivos, não todos que * glob captura no diretório, você sempre pode fazer uso da expansão do nome do caminho, algo como file{1..25} , ou ter um arquivo de texto de entrada, algo como este input.txt :
/path/to/folder_1/file1
/path/to/folder_1/file2
/path/to/folder_1/file3
E a partir disso, use while IFS= read -r line structure para ler o arquivo:
while IFS= read -r line || [ -n "$line" ]; do
cp "$line" "/path/to/folder_2/${line##*/}"
sleep 1
done < input.txt