Добавьте -F ','
, который сообщает awk о наличии разделителя запятой или, если вы используете |
. используйте -F '|'
, чтобы ваш скрипт теперь выглядел так
awk -F',' 'FNR==NR{a[$1];next};!($1 in a)' file1 file2 > file3
Да,
find /path/to/source/dir -type f -maxdepth 1 -ok mv {} /path/to/target/dir \;
Команда find
здесь найдет все обычные файлы в /path/to/source/dir
и запросит у пользователя разрешение на выполнение данной операции, которая в этом случае переместит файл в /path/to/target/dir
. Если пользователь нажметy
(и , введите ), операция будет выполнена.
{}
будет заменено именем каждого найденного файла по очереди, и команда, которая выполняется для каждого файла, заканчивается на \;
.
Если вы замените -ok
на -exec
, пользователю не будет предлагаться, и операция будет выполнена для всех файлов.
-maxdepth 1
ограничивает поиск файлов самым верхним каталогом (/path/to/source/dir
). Без него find
рекурсивно просматривал бы все подкаталоги по заданному пути.
-type f
ограничивает поиск только обычными файлами (, то есть не каталогами, сокетами, файлами устройств и т. д.)
В общем, я бы использовал подстановку оболочки, чтобы сгенерировать список файлов, с которыми вы хотите действовать, а затем выполнить чтение и проверку, чтобы решить, выполнять ли операцию.
Для (вашего )примера:
for f in *
do
[ -f "$f" ] || continue
read -p "mv $f to /tmp? "
if [ $REPLY = "y" ]
then
echo "moving $f to /tmp"
# mv -- "$f" /tmp
else
echo "not doing anything with $f"
fi
done
В зависимости от настроек вашей оболочки, это может или не может подобрать точечные -файлы (, например..bashrc
).
Вы можете изменить это по вкусу, --чтобы не отображать ответ "нет"; чтобы учесть «y» или «y» или «yes» или «yabadabadoo».