Làm phẳng phân cấp thư mục lưu giữ tên thư mục trong tên thư mục mới


7

Về cơ bản tôi muốn đi từ đây:

.
├── Alan Walker
│   ├── Different World
│   │   ├── 01 Intro.mp3
│   │   ├── 02 Lost Control.mp3
│   │   └── cover.jpg
│   └── Same World
│       ├── 01 Intro.mp3
│       └── 02 Found Control.mp3
├── Aurora
│   └── Infections Of A Different Kind Step 1
│       ├── 01 Queendom.lrc
│       ├── 02 Forgotten Love.lrc
│       └── 03 Gentle Earthquakes.mp3
└── Guns N' Roses
    └── Use Your Illusion I
        ├── 01 Right Next Door To Hell.lrc
        ├── 01 Right Next Door To Hell.mp3
        ├── 02 Dust N' Bones.lrc
        └── 02 Dust N' Bones.mp3

đến đây:

.
├── Alan Walker - Different World
│   ├── 01 Intro.mp3
│   ├── 02 Lost Control.mp3
│   └── cover.jpg
├── Alan Walker - Same World
│   ├── 01 Intro.mp3
│   └── 02 Found Control.mp3
├── Aurora - Infections Of A Different Kind Step 1
│   ├── 01 Queendom.lrc
│   ├── 02 Forgotten Love.lrc
│   └── 03 Gentle Earthquakes.mp3
└── Guns N' Roses - Use Your Illusion I
    ├── 01 Right Next Door To Hell.lrc
    ├── 01 Right Next Door To Hell.mp3
    ├── 02 Dust N' Bones.lrc
    └── 02 Dust N' Bones.mp3

Không có giải pháp nào tôi có thể tìm thấy bao gồm đổi tên thư mục. Thật tuyệt khi có thể làm điều này với zmv, nhưng tôi không thể tìm ra cách làm.


2
Không phải là một giải pháp đầy đủ, vì vậy không phải là một câu trả lời: easytagcó thể cho phép bạn làm điều này, nhưng chỉ cho các tệp âm thanh - Tôi không nghĩ rằng nó sẽ di chuyển bìa, v.v.
rvs

2
Có thể có nhiều hơn một album cho một nghệ sĩ cụ thể trong một thư mục nghệ sĩ? Là cấu trúc luôn luôn sâu ba cấp?
nohillside

1
@nohillside Có, Có thể có nhiều hơn một album cho một nghệ sĩ. Và vâng, cấu trúc luôn sâu ba cấp.
aksh1618

Câu trả lời:


9

Zsh

Chưa được kiểm tra:

zmv -Q '(*)/(*)(/)' '$1 - $2'
rmdir -- *(/^F)

Dòng thứ hai xóa tất cả các thư mục trống, ngay cả những thư mục không có tệp trước đó. Bạn có thể giải quyết vấn đề này với mvtrình bao bọc tùy chỉnh ghi lại những thư mục mà nó di chuyển mọi thứ từ đó.

Lưu ý rằng điều này đi qua các liên kết tượng trưng đến các thư mục trong thư mục hiện tại.

Linux đổi tên tiện ích

Chưa được kiểm tra.

rename / ' - ' */*/
rmdir -- */ 2>/dev/null

Lưu ý rằng điều này đi qua các liên kết tượng trưng đến các thư mục trong thư mục hiện tại và trong các thư mục con của nó. Dòng thứ hai xóa tất cả các thư mục trống, ngay cả những thư mục không có tệp trước đó.

Đổi tên kịch bản

Chưa được kiểm tra.

prename 's~/~ - ~' */*/
rmdir -- */ 2>/dev/null

Lưu ý rằng điều này đi qua các liên kết tượng trưng đến các thư mục trong thư mục hiện tại và trong các thư mục con của nó. Dòng thứ hai xóa tất cả các thư mục trống, ngay cả những thư mục không có tệp trước đó.

Đây là một cách tiếp cận phức tạp hơn, chỉ loại bỏ các thư mục mà nó đã đổi tên từ đó. Một lần nữa, chưa được kiểm tra.

prename 's~([^/]+)/~$1 - ~ and ++$d{$1}; END {map {rmdir} keys %d}' */*/

12

Một cái gì đó như thế này có thể?

#!/bin/sh

for topdir in */; do
    topdir_name=$( basename "$topdir" )

    for subdir in "$topdir"/*/; do
        subdir_name=$( basename "$subdir" )

        newdir="$topdir_name - $subdir_name"
        if mkdir "$newdir"; then
            mv "$subdir"/* "$newdir"
            rmdir "$subdir"
        fi
    done

    rmdir "$topdir"
done

Điều này đi qua tất cả các thư mục cấp cao nhất trong thư mục hiện tại (tên ban nhạc). Đối với mỗi thư mục như vậy, nó đi qua các thư mục con của nó (tên album). Đối với mỗi cặp tên nhóm và tên album, một thư mục mới được tạo và các tệp từ thư mục con được chuyển đến nó. Các thư mục con của album được xóa khi chúng được xử lý, như các thư mục cấp cao nhất của ban nhạc ban đầu.

Các rmdircuộc gọi sẽ thất bại nếu bất kỳ thư mục nào chứa tên tệp ẩn hoặc nếu bất kỳ thư mục mới nào không được tạo.

Đây là mã hoàn toàn chưa được kiểm tra. Chạy nó trên một bản sao lưu các tập tin của bạn.


Ý tôi là, vâng, một cái gì đó giống như sẽ hoạt động, nhưng tôi đang tìm kiếm một giải pháp một hoặc hai dòng, để chạy dễ dàng từ thiết bị đầu cuối. Một số ma thuật find / sed / zmv :)
aksh1618

10
Đặt ot vào một kịch bản, và -boom- nó trở thành một lớp lót.
Hans-Martin Mosner

4

Về mặt chiến lược, thay vì di chuyển các tệp, bạn đã xem xét để lại cấu trúc hiện tại và tạo liên kết cho cấu trúc mới mà bạn muốn chưa?

Về mặt chiến thuật, một mô hình sẽ thực hiện công việc như sau:

find . -mindepth 2 -maxdepth 2 -type d -print0 | xargs -0n1 bash -c \
  'b=$(basename "$(dirname "$1")"); a=$(basename "$1"); echo ln -s "$1" "$b-$a"' {}
  • findđịnh vị tất cả các thư mục chính xác hai cấp độ sâu từ thư mục làm việc hiện tại, đó phải là thư mục chứa các dải: do đó, hai cấp độ sâu là tên album bên dưới tên ban nhạc. 1
  • xargs tiêu thụ từng đường dẫn chứa một album và gọi ra tập lệnh bash nội tuyến.
  • bash -c '...'lấy đường dẫn album làm đối số đầu tiên, chia đường dẫn đó thành hai phần: band ( $b) và album ( $a). Cuối cùng, tập lệnh sắp xếp lại các tên thành định dạng mong muốn và liên kết tên thư mục mới với thư mục gốc.

Lưu ý rằng, trong ví dụ này, các liên kết sẽ được tạo trong cùng thư mục mà bạn bắt đầu, điều này cũng xảy ra ở nơi có tên các nhóm.

Bạn có thể - và nên - điều chỉnh lnchiến lược trên để phù hợp với ý định của bạn. mvvới các đường dẫn phù hợp nếu bạn thực sự muốn sắp xếp lại hoặc lnnếu bạn muốn tạo "chế độ xem" tiện lợi trên phương tiện truyền thông. Các phần quan trọng bên trong tập lệnh bash là:

  • $btên ban nhạc. Luôn luôn trích dẫn nó : "$b".
  • $atên album. Luôn luôn trích dẫn nó : "$a".
  • $1đường dẫn vật lý đến thư mục album. Luôn luôn trích dẫn nó : "$1".

1 Tôi tin rằng m{ax,in}depthđược GNU và một số BSD hỗ trợ find, nhưng không phải POSIX: trong trường hợp đó, dựa vào */*hoặc thể dục dụng cụ vỏ tương tự.


1
Tôi thích câu trả lời này ... bạn cũng có thể tạo liên kết cứng, sau đó xóa cấu trúc thư mục cũ khi bạn hài lòng
Thomas Zwaagstra

@ThomasZwaagstra Điều đó không khác gì việc di chuyển các tệp
Darkhogg

1
@Darkhogg Chính xác! OP đang tìm kiếm 1-liner để di chuyển các tập tin. Sử dụng liên kết cứng với giải pháp này sẽ gần như hoàn thành điều đó, ngoại trừ bạn sẽ có giai đoạn "xem trước" trung gian trước khi xóa các tệp gốc
Thomas Zwaagstra
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.