Предполагая, что ваш план резервного копирования состоит в том, чтобы предоставить список файлов на стандартном вводе, по одному на строку, а ваш основной план - предоставить список файлов в командной строке, по одному на аргумент:
#!/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
Как обычно в Unix, Ctrl-D в отдельной строке завершает стандартный ввод и позволяет программе продолжаться.
Но вы упомянули "отбрасывание", и это заставляет меня думать, что вам действительно нужна возможность перетаскивания. Для этого Утконос может быть чем-то, чтобы изучить. Я верю, что он объединит ваш сценарий в приложение, которое сделает для вас цель перетаскивания и передаст удаленные файлы в качестве аргументов вашему сценарию.
Обновление: если вы хотите, чтобы файлы содержали только один старый пробел между ними, чтобы в одной строке могли находиться несколько файлов, замените цикл while на:
while read -ea lfiles; do
for f in "${lfiles[@]}"; do
files[$filecnt]=$f
((filecnt++))
done
done
Или, если вы ожидаете только одну строку со всеми файлами на нем, вы можете упростить весь цикл while:
read -ea files
Однако имейте в виду, что при таком подходе вы должны вводить обратную косую черту перед любым пробелом, который вы на самом деле хотите включить в путь к файлу или каталогу, или сценарий будет анализировать ваш путь как несколько отдельных файлов! (Перетаскивание из Finder в Терминал автоматически выполнит эту обратную косую черту за вас.)