Di chuyển một nhóm các tệp, nhắc người dùng xác nhận cho mọi tệp


9

Hệ thống: Ubuntu MATE 18.04.

Tôi có một tập hợp các tệp (trong nhiều thư mục trong cấu trúc thư mục) và tôi muốn chuyển nhiều tệp sang thư mục khác. Tôi có thể biết tệp nào tôi muốn di chuyển theo tên của chúng (chúng là tiêu đề công thức), nhưng không có cách nào khác để phân biệt giữa các tệp tôi muốn di chuyển và các tệp tôi không muốn di chuyển; Tôi cần đưa ra quyết định cho mọi tệp bằng cách tự kiểm tra tên.

Vì vậy, tôi đang chạy lệnh một lần cho mỗi tệp tôi muốn di chuyển, như

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

Ngay cả với việc hoàn thành tab này cũng không phải gõ nhiều. Những gì tôi thực sự muốn làm là một cái gì đó như

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

Vì vậy, tôi chỉ có thể nhấn yhoặc ncho mỗi tập tin.

Làm cách nào tôi có thể di chuyển một nhóm tệp và được nhắc xác nhận cho mọi tệp?

Câu trả lời:


6

Cách 1: Trong trình duyệt tệp đồ họa của bạn, sử dụng chế độ xem dạng cây

Tôi cho rằng mục tiêu thực tế của bạn là đưa ra lựa chọn cho mỗi tệp và không nói đúng để được nhắc . Tuy nhiên, nếu bạn muốn được nhắc về từng tệp trong một thiết bị đầu cuối, hãy xem Cách 2 bên dưới.

Hầu hết các trình duyệt tệp đồ họa hỗ trợ chế độ xem dạng cây trong đó bạn có thể xem nhiều cấp của phân cấp thư mục cùng nhau. Bạn có thể sao chép hoặc di chuyển các tệp ra khỏi chế độ xem này, riêng lẻ hoặc bằng cách chọn chúng và sau đó vận hành trên toàn bộ lựa chọn. Điều này hoạt động ngay cả với các tập tin từ nhiều thư mục.

Trong một số trình duyệt tệp, người ta phải vào menu Tùy chọn để bật chế độ xem dạng cây. Trong Caja, trình duyệt tệp MATE, trình duyệt này luôn được bật trong chế độ xem danh sách. Nhấp vào Xem → Danh sách (hoặc nhấn Ctrl+ 2) để chuyển sang chế độ xem danh sách. Mỗi thư mục có một hình tam giác nhỏ bên phải ở bên trái của nó, cho thấy nó có thể được mở rộng. Để mở rộng thư mục, nhấp vào hình tam giác đó hoặc nhấn phím (mũi tên phải) khi thư mục được chọn. Trong ví dụ này, tôi đã chọn tất cả từng cái một và đang kéo tất cả chúng cùng một lúc đích đến của chúng:

nhiều tệp được chọn trong cấu trúc cây trong trình duyệt tệp Caja, bị kéo vào thư mục khác nhưng chưa được di chuyển

Giả sử nguồn và đích nằm trên cùng một ổ đĩa, kéo di chuyển theo mặc định. Nếu bạn muốn sao chép thay vào đó, bạn sẽ giữ Ctrlphím.

tình huống sau khi di chuyển kéo đã hoàn thành, trong đó các tệp được chọn giờ đây được đặt cùng nhau trong thư mục đích thay vì các vị trí riêng biệt ban đầu của chúng

Về lý thuyết, thật dễ dàng để sửa lỗi khi sử dụng phương pháp này, bởi vì hầu hết các trình duyệt tệp (bao gồm cả Caja) đều hỗ trợ Ctrl+ Zđể hoàn tác các hành động gần đây, bao gồm các hành động hàng loạt. Tuy nhiên, tôi đã gặp may mắn với điều đó. Đôi khi các tập tin trở lại vào thư mục sai.

Tin tốt là bạn dường như đang làm việc với hầu hết các tài liệu văn bản, có xu hướng nhỏ, vì vậy bạn có thể tạo một bản sao lưu bổ sung với tarlần đầu tiên mà không gặp nhiều rắc rối. Tôi đề nghị làm điều đó bất kể bạn sử dụng phương pháp nào.

Cách 2 : findLệnh với -okhành động

Nó được sử dụng phổ biến findđể tìm các tệp và chuyển các đường dẫn của chúng tới một lệnh bên ngoài tùy ý với các hành động -exec-execdir. Nhưng findcũng có -ok-okdirnhắc nhở đó trước mỗi lần họ chạy một lệnh. Nếu bạn thực sự muốn được nhắc trong một thiết bị đầu cuối về mỗi tệp, tôi nghĩ rằng đây là cách để đi.

Khi được thực hiện để tạo ra các hiệu ứng tương tự như được hiển thị ở trên, nó trông như thế này:

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

Thay thế Textsbằng thư mục nguồn (có thể chỉ là .nếu bạn đang cdtruy cập nó) và Glorious Destination Foldervới thư mục đích thực tế.

Điều này chạy một lệnh cho mỗi tệp; không giống -exec-execdir, -ok-okdirkhông hỗ trợ +thay thế \;để vượt qua nhiều đường dẫn tìm thấy trong cùng một lệnh. Do đó, bạn không cần phải sử dụng -t desthình thức mv. Tôi đề nghị làm như vậy dù sao, tuy nhiên, cả hai nói chung với findvà đặc biệt là trong tình huống này nên nhắc nhở trông giống như các lệnh họ đang thúc đẩy về.

Vì lệnh đó được viết, nếu findgặp một liên kết tượng trưng mà cuối cùng trỏ đến một tệp thông thường, nó (liên kết, không phải mục tiêu) được di chuyển thay vì bỏ qua. Nếu bạn thực sự muốn vận hành chỉ một tệp thông thường, hãy sử dụng -type fthay vì -xtype f.

Bạn có thể muốn làm điều này trong một scriptphiên để bạn có thể tìm ra điều gì đã xảy ra nếu bạn mắc lỗi. Nhưng một lần nữa, không có lý do để không có một bản sao lưu.

Cách 3: Tạo một bảng kê khai và chỉnh sửa nó

Ít nhất là miễn là các tệp không có dòng mới trong tên của chúng, bạn có thể bắt đầu bằng cách sử dụng một findlệnh đơn giản để tạo tệp kê khai - một tệp liệt kê tên của các tệp mà bạn (trong trường hợp này có khả năng) quan tâm :

find Texts -xtype f >manifest

Thay thế manifestbằng bất kỳ tên nào bạn thích cho tệp liệt kê các tệp đang xem xét (và điều chỉnh các hướng còn lại cho phù hợp).

Như trên, thay thế Textsbằng thư mục nguồn thực tế của bạn, có thể là .nếu bạn đã cdvào nó. Tuy nhiên, nếu Textslà một đường dẫn tương đối (bao gồm cả nếu nó .) thì bạn nên đảm bảo ở cùng một vị trí sau này khi bạn thực sự thực hiện các động tác.

Sau khi chạy findlệnh đó , mở manifesttrong trình soạn thảo văn bản. Đây có thể là nano, vim, emacs, gedit, pluma, vv Trong các biên tập viên, bình luận ra các dòng tên tập tin mà bạn không muốn di chuyển bằng cách đặt một #vào đầu họ. Một số biên tập viên sẽ làm nổi bật những dòng đó một cách khác nhau ngay cả khi nó không nhận ra tệp của bạn ở bất kỳ định dạng nào mà nó biết có nhận xét. Mặc dù vậy, hầu hết sẽ không, và lý do thực sự tôi khuyên bạn nên làm theo cách này là bạn, với tư cách là một con người, có khả năng có kinh nghiệm nhận xét các dòng trong các tệp cấu hình (và có lẽ trong mã nguồn). Tôi nghĩ rằng đây là trực quan hơn, và ít lỗi hơn, hơn nó sẽ được đánh dấu dòng bạn làm muốn di chuyển.

Tất nhiên, thay vào đó, bạn chỉ có thể xóa các dòng cho các tệp bạn không muốn di chuyển. Ưu điểm của việc nhận xét chúng là nó sẽ rõ ràng hơn về những gì bạn đã làm.

Trong ví dụ của tôi, đây là nội dung của tệp sau khi tôi chỉnh sử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

Sau đó, bạn có thể lọc ra các dòng nhận xét grepvà đưa ra kết quả xargsđể chuyển chúng tới mv:

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

Như trên, thay thế Glorious Destination Folderbằng tên của điểm đến thực tế. Đó là nó; các tập tin của bạn được di chuyển. Tất nhiên bạn có thể viết echotrước mvđể xem các lệnh sẽ được chạy trước, nếu bạn muốn.

Cách thức hoạt động của lệnh là:

  1. Các grepdòng lệnh đầu ra từ manifestđó không ( -v) bắt đầu ( ^) với tùy chọn ( *) khoảng trắng ( \s) tiếp theo là một chữ #nhân vật. Các -Pcờ chọn PCRE là phương ngữ của biểu thức thông thường (cho phép \smà tôi xem xét dễ đọc hơn so với truyền thống [[:space:]]).
  2. Các xargslệnh chia đầu vào của nó (mà là sản phẩm của grep) vào các lĩnh vực newline-chấm dứt ( -d '\n'), sau đó dán từng lĩnh vực (không có xuống dòng chấm dứt) như là một lập luận riêng biệt ở phần cuối của lệnh mv -t 'Glorious Destination Folder', mà nó chạy.

1
-okIMHO câu trả lời hay nhất
pim

7

Đây là một đoạn script nhỏ ( 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

Sử dụng mẫu:

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

đừng quên làm cho tập lệnh thực thi ( chmod +x mv-confirm.sh).

Lưu ý

Vì tôi không muốn làm hỏng các tập tin của bạn, tôi đã thêm vào echotrước mv lệnh thực tế . Hãy thoải mái loại bỏ nó để thực sự di chuyển các tập tin.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.