Supondo que seu plano de backup forneça uma lista de arquivos na entrada padrão, um por linha, e seu plano principal é fornecer uma lista de arquivos na linha de comando, um por argumento:
#!/bin/bash
declare -a files # let's use an array to avoid whitespace tokenization
let filecnt=0
if [ "$#" -gt 0 ]; then
# we have args!
for f in "$@"; do
files[$filecnt]="$f"
((filecnt++))
done
else
# we have filenames on stdin!
while read -e line; do
files[$filecnt]="$line"
((filecnt++))
done
fi
# now do whatever you need to do with the filenames
for filename in "${files[@]}"; do
echo "$filename"
done
Como é normal no Unix, Ctrl-D em sua própria linha termina stdin e permite que o programa continue.
Mas você mencionou "drop", o que me faz pensar que o que você realmente gosta é de um recurso "arrastar e soltar". Para isso, o Ornitorrinco pode ser algo para se investigar. Acredito que ele irá agregar seu script em um aplicativo que faz um alvo arrastar e soltar para você e passa os arquivos removidos como argumentos para seu script.
Atualização : Se você quisesse ter arquivos com apenas um espaço em branco antigo entre eles, para que vários arquivos pudessem estar na mesma linha, substitua-os por:
while read -ea lfiles; do
for f in "${lfiles[@]}"; do
files[$filecnt]=$f
((filecnt++))
done
done
Ou se você espera apenas uma linha com todos os arquivos nela, você pode simplificar todo esse loop enquanto:
read -ea files
Entretanto, esteja ciente de que, com essa abordagem, você deve digitar uma barra invertida na frente de qualquer espaço que realmente deseje fazer parte de seu caminho de arquivo ou diretório, ou o script analisará seu pathname como vários arquivos separados! (No entanto, arrastar e soltar do Finder no Terminal fará automaticamente esse escape de barra invertida para você.)