Làm thế nào bạn có thể di chuyển (hoặc sao chép) tất cả các tệp vào một thư mục có cùng tiền tố tên tệp?


9

Sử dụng Bash

Vì vậy, giả sử tôi có một loạt các tệp được đặt ngẫu nhiên trong thư mục mẹ ~/src, tôi muốn lấy tất cả các tệp khớp với một hậu tố nhất định và di chuyển (hoặc sao chép) chúng vào một ~/distthư mục.

Giả sử cho mục đích này rằng tất cả các tên tệp đều có quy ước đặt tên này:

<filename_prefix>.<filename_suffix>

Tôi phát hiện ra rằng đây là một cách nhanh chóng để lấy tất cả các tệp với một tệp cụ thể filename_suffixvà đặt chúng vào một thư mục dist:

mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;

Bây giờ là một bước nữa ... làm thế nào tôi có thể sử dụng đầu ra của find, trong trường hợp này filenamevà sử dụng filename_prefixđể tạo một thư mục cùng tên ~/distvà sau đó di chuyển (hoặc sao chép) tất cả các tệp có tiền tố đó vào thư mục thích hợp?

mkdir ~/dst
find source -name "*.xrt,*.ini,*.moo" -exec mv -i {} -t ~/dst \;

Về cơ bản, làm cách nào để thay đổi lệnh trên (hoặc có thể sử dụng lệnh khác), để tạo cấu trúc như thế này

(ĐẦU RA)

~/dist/people/people.xrt
~/dist/games/games.xrt
~/dist/games/games.moo
~/dist/games/games.ini
~/dist/monkeys/monkeys.ini
~/dist/monkeys/monkeys.xrt

từ một cây thư mục như thế này?

(ĐẦU VÀO)

~/src/xrt/people.xrt
~/src/xrt/games.xrt
~/src/conf/games.ini
~/src/pack/monkeys.xrt
~/src/e344/games.moo
~/src/e344/monkeys.moo
~/src/en-us/monkeys.ini

Câu trả lời:


10

Nó sẽ là một địa ngục để nói findphải làm gì trong trường hợp này.

Sử dụng vỏ tốt hơn:

for i in **/*.{xrt,ini,moo}; do
  FILE=$(basename "$i")
  DIR=~/dst/${FILE%.*}
  echo mkdir -p -- "$DIR"
  echo mv -i -t "$DIR" -- "$i"
done

Sử dụng shopt -s globstarđể làm cho toàn **cầu hoạt động (hoặc sử dụng zsh!). Và loại bỏ echos sau nếu lệnh in những gì bạn muốn.


sử dụng bash này có giống nhau không?
qodeninja

@codeninja shopt -s globstar, xem chỉnh sửa của tôi. Nếu chỉ có hai cấp độ, bạn có thể sử dụng */*.*và đoạn mã sẽ hoạt động trong bất kỳ trình bao nào.
Gilles 'SO- ngừng trở nên xấu xa'

2

gian lận tìm dòng lệnh:

find source -name "*.xrt,*.ini,*.moo" -exec env file={} bash -c 'base="$(basename "$file")";dir="dst/${base%.*}";mkdir -p "$dir";cp "$file" "$dir"' \;

thực sự là một công việc xung quanh để gọi tập lệnh bash trong tìm LOL.

= P


1
Đoán xem điều gì xảy ra nếu có một tập tin có tên là happy rm -rf /! Loại mã này xứng đáng -1.
Stéphane Gimenez

Chỉnh sửa của bạn là không đủ: giả sử bạn đã bấm vào một liên kết và tải xuống Yay" rm -rf / "Rox0r.avi, một lần nữa lại có vấn đề như vậy
Stéphane Gimenez

(Và không có cách nào để làm cho loại thay thế này an toàn).
Stéphane Gimenez

1
Ah có lẽ nó có thể làm điều này khác đi. Có vẻ như các công trình sau : -exec bash -c 'command which uses "$1"' bash '{}' ';'. Chà, dù sao nó cũng khá vô nghĩa.
Stéphane Gimenez

1
@ StéphaneGimenez đã xong, bash không phải là thứ duy nhất để sử dụng. LOL
yuyichao
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.