Переместить группу файлов, запрашивая у пользователя подтверждение для каждого файла

Система: Ubuntu MATE 18.04.

У меня есть коллекция файлов (в нескольких каталогах в структуре каталогов), и я хочу переместить многие из них в другой каталог. Я могу сказать, какие файлы я хочу переместить, по их именам (они являются названиями рецептов), но нет другого способа отличить файлы, которые я хочу переместить, и файлы, которые я не хочу переместить; Мне нужно принять решение по каждому файлу, проверяя имя самостоятельно.

Итак, я запускаю команду по одному разу для каждого файла, который я хочу переместить, например

mv Snacks/OkaraCrackers NeedsTesting/
mv Snacks/SunflowerBrittle NeedsTesting/
mv Treats/ChocolateChilliFudge NeedsTesting/
mv Treats/PecanBlondies NeedsTesting/

Даже после завершения табуляции это слишком много печатает. Я действительно хочу сделать что-то вроде

shopt -s globstar
mv --prompt-me-for-every-file ** NeedsTesting/

, поэтому я могу просто нажать y или n для каждого файла.

Как я могу переместить группу файлов и получить запрос на подтверждение каждого файла?

9
задан 26 July 2019 в 10:11

2 ответа

Путь 1: В Вашем браузере графических файлов, с помощью структурного вида

Я предполагаю, что Ваша фактическая цель состоит в том, чтобы сделать выбор для каждого файла, и не строго говоря быть запрошенной. Однако, если Вы предпочитаете быть предложенными о каждом файле в терминале, посмотрите Путь 2 ниже.

Большинство браузеров графических файлов поддерживает структурный вид, где можно просмотреть несколько уровней иерархии каталогов вместе. Можно скопировать или переместить файлы из этого представления, или индивидуально или путем выбора их и затем работы на целый выбор. Это работает даже с файлами от нескольких папок.

В некоторых файловых браузерах нужно войти в Меню свойства для включения структурного вида. В Caja, файловом браузере ПОМОЩНИКА, это всегда включается в представлении списка. Нажмите View → Список (или нажмите Ctrl+2) переключаться на представление списка. Каждый каталог имеет небольшой направо стоящий треугольник слева от него, указывая, что он может быть расширен. Для разворачивания папки нажмите тот треугольник или нажмите (стрелка вправо) ключ, когда папка будет выбрана. В этом примере я выбрал их всех один за другим, и перетаскиваю их внезапно их место назначения:

multiple files selected in a tree structure in the Caja file browser, being dragged into another folder but not yet moved

Принятие источника и места назначения находится на том же диске, перетаскивая перемещения по умолчанию. Если бы Вы хотели скопировать то вместо этого, Вы удержали бы клавишу Ctrl.

the situation after the drag-move has completed, in which the files that were selected are now all together in the destination folder instead of their original separate locations

В теории легко зафиксировать ошибки при использовании этого метода, потому что большинство файловых браузеров (включая Caja) поддерживает Ctrl+Z для отмены недавних действий, включая пакетные действия. Однако у меня была смешанная удача с этим. Иногда файлы возвращаются в неправильную папку.

Хорошие новости - то, что Вы, кажется, работаете с главным образом текстовыми документами, которые имеют тенденцию быть маленькими, таким образом, можно сделать дополнительное резервное копирование с tar сначала без большого количества стычки. Я предлагаю делать это независимо от того, какой метод Вы используете.

Путь 2: find команда с -ok действие

Это - общее использование find найти файлы и передать их пути к произвольной внешней команде с -exec и -execdir действия. Но find также имеет -ok и -okdir та подсказка перед каждым разом они выполняют команду. Если Вы действительно хотите быть предложенными в терминале о каждом файле, я думаю, что это - способ пойти.

При выполнении для произведения тех же эффектов как показано выше, который похож на это:

ek@Gnar:~$ find Texts -xtype f -ok mv -t 'Glorious Destination Folder' {} \;
< mv ... Texts/Robert Frost/New Hampshire.pdf > ? y
< mv ... Texts/Robert Frost/In The Clearing.pdf > ? n
< mv ... Texts/Helen Keller/The Story of My Life.pdf > ? y
< mv ... Texts/Saki/The Short Stories of Saki.pdf > ? y
< mv ... Texts/Jane Austen/Sense and Sensibility.pdf > ? n
< mv ... Texts/Jane Austen/Pride and Prejudice.pdf > ? y
< mv ... Texts/Richard Connell/The Stolen Crime.pdf > ? n
< mv ... Texts/Richard Connell/The Most Dangerous Game.txt > ? y
< mv ... Texts/Mary Wollstonecraft Shelley/Mathilda.epub > ? n
< mv ... Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf > ? y
< mv ... Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf > ? n
< mv ... Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm > ? y

Замена Texts с исходным каталогом (который мог просто быть . если Вы cd'd к нему) и Glorious Destination Folder с фактическим целевым каталогом.

Это выполняет одну команду на файл; в отличие от этого, -exec и -execdir, -ok и -okdir не поддерживать + вместо \; передать несколько найденных путей в том же вызове команды. Следовательно, Вы не должны использовать -t dest форма mv. Я предлагаю делать так так или иначе, тем не менее, обоих в целом с find и особенно в этой ситуации, таким образом, подсказки больше походят на команды, о которых они запрашивают.

Поскольку та команда записана, если find встречается с символьной ссылкой, которая в конечном счете указывает на регулярный файл, это (ссылка, не цель) перемещено, а не проигнорировано. Если Вы действительно хотите управлять всего регулярными файлами, использовать -type f вместо -xtype f.

Можно хотеть сделать это в a script сессия, таким образом, можно выяснить то, что произошло, если Вы делаете ошибку. Но снова, никакая причина не иметь резервное копирование.

Путь 3: Генерируйте декларацию и отредактируйте ее

По крайней мере, пока файлы не имеют новых строк на свои имена, можно запустить при помощи простого find команда для генерации декларации - файл, который перечисляет названия файлов, которыми Вы (в этом случае потенциально) заинтересованы:

find Texts -xtype f >manifest

Замена manifest с любым именем Вам нравится за файл, который перечисляет файлы на рассмотрении (и скорректируйте остающиеся направления соответственно).

Как выше, замена Texts с Вашим фактическим исходным каталогом, который мог быть . если Вы имеете cd'd к нему. Однако, если Texts относительный путь (включая то, если это .) затем необходимо удостовериться, что были в том же месте позже при фактическом выполнении перемещений.

После выполнения этого find команда, открытая manifest в текстовом редакторе. Это могло быть nano, vim, emacs, gedit, pluma, и т.д. В редакторе, прокомментируйте строки, которые называют файлы, которые Вы не хотите перемещать путем размещения a # в начале их. Некоторые редакторы выделят те строки по-другому, даже когда это не распознает, что Ваш файл любого формата, это знает, имеет комментарии. Большинство не будет, тем не менее, и настоящая причина, я предлагаю сделать это, этот путь состоит в том, что у Вас, как человек, вероятно, будет опыт при комментировании строк в конфигурационных файлах (и возможно в исходном коде). Я думаю, что это более интуитивно, и менее подвержено ошибкам, чем это должно было бы отметить строки, которые Вы действительно хотите переместить.

Конечно, Вы могли вместо этого просто удалить строки для файлов, которые Вы не хотите перемещать. Преимущество комментирования их состоит в том, что будет ясно позже, что Вы сделали.

В моем примере это - то, на что было похоже содержание файла после того, как я отредактировал его:

Texts/Robert Frost/New Hampshire.pdf
# Texts/Robert Frost/In The Clearing.pdf
Texts/Helen Keller/The Story of My Life.pdf
Texts/Saki/The Short Stories of Saki.pdf
# Texts/Jane Austen/Sense and Sensibility.pdf
Texts/Jane Austen/Pride and Prejudice.pdf
# Texts/Richard Connell/The Stolen Crime.pdf
Texts/Richard Connell/The Most Dangerous Game.txt
# Texts/Mary Wollstonecraft Shelley/Mathilda.epub
Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf
# Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf
Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm

Затем можно отфильтровать прокомментированные строки с grep и передайте результат по каналу к xargs передать их mv:

grep -Pv '^\s*#' manifest | xargs -d '\n' mv -t 'Glorious Destination Folder'

Как выше, замена Glorious Destination Folder с именем фактического места назначения.Именно; Ваши файлы перемещены. Можно, конечно, записать echo прежде mv видеть команды, которые будут выполнены сначала, если Вам нравится.

Путь, которые управляют работами:

  1. grep выходные строки команды от manifest это не делает (-v) запустите (^) с дополнительным (*) пробел (\s) сопровождаемый литералом # символ. -P отметьте выбирают PCRE как диалект регулярных выражений (который включает \s который я считаю более читаемыми, чем традиционное [[:space:]]).
  2. xargs команда делит свой вход (который является выводом grep) в завершенные новой строкой поля (-d '\n'), затем вставляет каждое поле (без завершающейся новой строки) как отдельный аргумент в конце команды mv -t 'Glorious Destination Folder', который это выполняет.
6
ответ дан 23 November 2019 в 04:57

Вот маленький сценарий (mv-confirm.sh):

#!/bin/bash

# Just make sure there are at least one source and one destination
if [ "$#" -lt 2 ]; then
    echo "Illegal number of parameters"
fi

DESTINATION=${*:$#}             # last argument
SOURCES=( ${@:1:$#-1} )         # all but last arguments

for i in "${SOURCES[@]}"
do
    read -p "move '$i' to '$DESTINATION' ? [y/n] " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]
    then
        echo mv "$i" "$DESTINATION"
    fi
done

Демонстрационное использование:

./mv-confirm.sh ** somewhere
move 'a' to 'somewhere' ? [y/n] n
move 'b' to 'somewhere' ? [y/n] y
mv b d
...

не забывайте делать исполняемый файл сценария (chmod +x mv-confirm.sh).

NB

Так как я не хочу смешивать с Вашими файлами, добавил я echo перед фактическим mv команда. Не стесняйтесь удалять его для того, чтобы на самом деле переместить файлы.

7
ответ дан 23 November 2019 в 04:57

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

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