Các thư mục con khác với nội dung thư mục ban đầu trong linux


7

Tôi có một thư mục, /Landsat_Data/trong đó có chứa các thư mục con ( Landsat_Data/Site1, Landsat_Data/Site2, vv). Mỗi thư mục con chứa .tar.gzcác tệp (ví dụ: /Landsat_Data/Site2/LE70930862008092-SC20160107074735.tar.gzv.v.) và mỗi .tar.gztệp chứa các tệp tif hoặc xml như thế này

-rw-r--r-- espa/ie  29952 2016-01-07 14:57 LT50930861991021ASA00_sr_snow_qa.tif 

Những gì tôi muốn làm là gỡ từng tệp tar vào thư mục con riêng của nó (ví dụ Landsat_Data/Site2/LE70930862008092-SC20160107074735/).

Cho đến nay, tôi đang sử dụng dòng lệnh này trong khi là thư mục Landsat_Data:

find . -type f -name "*.tar.gz" -execdir tar -xvzf {} \;

Tuy nhiên, lệnh này trích xuất tất cả các tệp tif và xml vào mỗi thư mục con (ví dụ Landsat_Data/Site2) trong khi tôi chỉ muốn mở khóa LE70930862008092-SC20160107074735.tar.gzđể có một thư mục con được gọi LE70930862008092-SC20160107074735có chứa tất cả các tệp tif và xml. Bất cứ ý tưởng làm thế nào tôi có thể đạt được những gì tôi muốn?


Chúng ta có thể thấy một mẫu tar -tvfcủa một tập tin tar không? Có vẻ như thư mục con của bạn có cấu trúc thư mục xa hơn, chúng ta có thể thấy một mẫu của nó không?
Zachary Brady

Khi bạn nói "thư mục tar", bạn có nghĩa là " tập tin tar ", phải không? Ồ, và trong thế giới * nix, chúng tôi không có thư mục, chúng tôi có "thư mục" :)
terdon

@Zachary -rw-r - r-- Espa / tức là 59416 2016-01-07 14:57 LT50930861991021ASA00_sr_band5.tif -rw-r - r-- đặc biệt
SimonB

Chào mừng bạn đến với Unix & Linux! Vui lòng chỉnh sửa câu hỏi của bạn để thêm thông tin. Nó là khó đọc và dễ bỏ lỡ trong các ý kiến. Ngoài ra, ý kiến ​​có thể bị xóa mà không có cảnh báo.
terdon

@terdon Tôi có các thư mục tar chứa các tệp tif khác nhau như được hiển thị trong một nhận xét trước đó. Chỉ muốn gỡ các thư mục trong khi các tập tin ở trong thư mục. Hy vọng nó là rõ ràng.
SimonB

Câu trả lời:


5

thử

find . -type f -name "*.tar.gz" -execdir tar -xvzf {} \;

dựa theo man find

lệnh -execdir;

lệnh -execdir {} +

Giống như -exec, nhưng lệnh được chỉ định được chạy từ thư mục con chứa tệp phù hợp, thường không phải là thư mục mà bạn bắt đầu tìm thấy.


Cảm ơn. Nhưng điều này trích xuất các tập tin chứa trong thư mục tar nhưng tôi chỉ muốn gỡ bỏ thư mục tar trong khi các tập tin nằm trong các thư mục unar. Bất kỳ đầu mối làm thế nào để làm điều đó?
SimonB

@SimonB bạn có thể chỉnh sửa bài đăng 1) với nội dung của thư mục ban đầu 2) tệp được trích xuất dự định không?
Archemar

2

Đây là một cách (điều này giả sử bạn đang sử dụng bash):

$ shopt -s globstar   
$ for tar in /Landsat_Data/**/*.tar.gz; do 
   tar xvzf "$tar" --one-top-level="$(dirname "$tar")"/"$(basename "$tar" .tar.gz)"
  done

Các globstarlàm cho lựa chọn **phù hợp với 0 hoặc nhiều tập tin và thư mục một cách đệ quy, vì vậy /Landsat_Data/**/*.tar.gzsẽ phù hợp với tất cả các *tar.gztập tin trong bất kỳ thư mục con của /Landsat_Data/. Các dirnamelệnh in tên thư mục đầu vào của nó và basenamechỉ có tên với phần mở rộng bạn cho nó (ở đây tar.gzloại bỏ Vì vậy, ví dụ.:

$ dirname /Landsat_Data/Site2/LE70930862008092-SC20160107074735.tar.gz
/Landsat_Data/Site2
$ basename /Landsat_Data/Site2/LE70930862008092-SC20160107074735.tar.gz .tar.gz
LE70930862008092-SC20160107074735

Điều --one-top-levelnày được giải thích trong man tar:

   --one-top-level[=DIR]
          Extract all files into DIR, or, if used without argument, into a
          subdirectory  named by the base name of the archive (minus stan‐
          dard compression suffixes recognizable by --auto-compress).

Được kết hợp với nhau, điều này sẽ làm những gì bạn muốn.


Nếu bạn tarkhông có tùy chọn đó, bạn có thể thực hiện thủ công:

$ shopt -s globstar   
$ for tar in /Landsat_Data/**/*.tar.gz; do 
    newdir="$(dirname "$tar")"/"$(basename "$tar" .tar.gz)"
    mkdir "$newdir"
    tar xvzf "$tar" -C "$newdir"
  done 

Cảm ơn terdon. Tôi có một thông báo lỗi mặc dù. 'tùy chọn không được nhận dạng' --one-top-level = / Landsat_Data / ** / * '
SimonB

@SimonB bạn đang sử dụng hệ điều hành nào?
terdon

Tôi đang dùng hệ điều hành linux
SimonB

@SimonB lạ, có lẽ bạn có tarphiên bản cũ hơn . Dù sao, xem câu trả lời cập nhật.
terdon
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.