Перемістіть групу файлів, що вимагає від користувача підтвердження для кожного файлу


9

Система: 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для кожного файлу.

Як я можу перемістити групу файлів і попросити підтвердити кожен файл?

Відповіді:


6

Шлях 1: у вашому браузері графічних файлів, використовуючи подання дерева

Я припускаю, що ваша реальна мета - зробити вибір для кожного файлу, а не строго кажучи, щоб його запросили . Однак, якщо вам більше потрібне запит про кожен файл у терміналі, див. Спосіб 2 нижче.

Більшість веб-переглядачів графічних файлів підтримують перегляд дерева, де ви можете переглядати кілька рівнів ієрархії каталогів разом. Ви можете скопіювати або перемістити файли з цього представлення, окремо, або вибравши їх, а потім оперуючи всім виділенням. Це працює навіть з файлами з декількох папок.

У деяких браузерах файлів потрібно перейти в меню налаштувань, щоб увімкнути дерево. У Caja, браузері файлів MATE, це завжди увімкнено у поданні списку. Клацніть Перегляд → Список (або натисніть Ctrl+ 2), щоб перейти до подання списку. Кожен каталог має невеликий правокутний трикутник ліворуч від нього, що означає, що його можна розширити. Щоб розгорнути папку, натисніть цей трикутник або натисніть клавішу (стрілка вправо), коли вибрано папку. У цьому прикладі я вибрав їх по одному і перетягнув їх відразу за призначенням:

кілька файлів, вибраних у структурі дерева у файлі браузера Caja, перетягуються в іншу папку, але ще не переміщені

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

ситуація після завершення перетягування, в якому вибрані файли тепер усі разом у папці призначення замість їх початкових окремих місць

Теоретично виправити помилки при використанні цього методу, оскільки більшість файлових браузерів (включаючи 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до нього) і Glorious Destination Folderфактичним каталогом призначення.

Це виконує одну команду на файл; в відміну від -execі -execdir, -okі -okdirне підтримують +в місці , \;щоб пройти кілька шляхів , знайдених в тому ж виклику команди. Отже, вам не потрібно використовувати -t destформу mv. Я пропоную робити це в будь-якому випадку, хоча, як в цілому з findі особливо в цій ситуації , так що підказки виглядають як команди вони спонукали о.

Оскільки ця команда написана, якщо findзустрічається символічне посилання, яке в кінцевому підсумку вказує на звичайний файл, воно (посилання, а не ціль) переміщується, а не ігнорується. Якщо ви дійсно хочете оперувати лише одним звичайним файлом, використовуйте -type fзамість цього -xtype f.

Ви можете зробити це на scriptсеансі, щоб ви могли зрозуміти, що сталося, якщо ви помилитесь. Але знову ж таки, ніяких причин не мати резервної копії.

Спосіб 3: Створіть маніфест і відредагуйте його

Принаймні до тих пір, поки у файлах немає нових рядків у своїх іменах, ви можете почати, використовуючи просту findкоманду для створення маніфесту --файлу, який перелічує імена файлів, які вас (у цьому випадку потенційно) цікавлять :

find Texts -xtype f >manifest

Замініть manifestна будь-яке ім’я файлу, у якому перераховані файли, що розглядаються (і відповідно відрегулюйте інші вказівки).

Як зазначено вище, замініть Textsсвою фактичну каталогію джерела, що могло б бути, .якщо ви хочете cdдо неї. Однак якщо Textsце відносний шлях (у тому числі, якщо він є .), то ви повинні переконатися, що ви знаходитесь в тому самому місці пізніше, коли ви дійсно виконуєте рухи.

Після запуску цієї findкоманди відкрийте manifestв текстовому редакторі. Це може бути nano, vim, emacs, gedit, plumaі т.д. У редакторі закоментуйте ліній, назва файлів , які ви НЕ хочете , щоб рухатися, поставивши #на початку їх. Деякі редактори підкреслять ці рядки по-різному, навіть якщо він не визнає, що ваш файл має будь-який формат, він знає, що має коментарі. Хоча більшість не буде, і справжня причина, яку я пропоную зробити так, полягає в тому, що ви, як людина, швидше за все, будете мати досвід коментувати рядки у файлах конфігурації (і, можливо, у вихідному коді). Я думаю , що це більш інтуїтивним, і менше помилок, ніж це було б , щоб відзначити рядки , які ви дійсно хочете перемістити.

Звичайно, ви можете замість цього просто видалити рядки для файлів, які ви не хочете переміщувати. Перевага коментувати їх полягає в тому, що згодом буде зрозуміло, що ви зробили.

У моєму прикладі так виглядав вміст файлу після його редагування:

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', якій вона працює.

1
-okІМХО найкраща відповідь
pim

7

Ось невеликий сценарій ( 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 командою. Не соромтесь видалити його для фактичного переміщення файлів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.