Làm cách nào để tôi có thể đổi tên các tệp đã tải xuống để không bao gồm chuỗi truy vấn?


32

Tôi đang tải xuống một trang web với wget và rất nhiều liên kết có các truy vấn được đính kèm với chúng, vì vậy khi tôi làm điều này:

wget -nv -c -r -H -A mp3 -nd http://url.to.old.podcasts.com/

Tôi kết thúc với rất nhiều tập tin như thế này:

1.mp3?foo=bar
2.mp3?blatz=pow
3.mp3?fizz=buzz

Những gì tôi muốn kết thúc là:

1.mp3
2.mp3
3.mp3

Đây là tất cả diễn ra trong linux Ubuntu và tôi đã có 1.10.2.

Tôi biết tôi có thể làm điều này sau khi tôi nhận được mọi thứ thông qua một kịch bản để đổi tên mọi thứ. Tuy nhiên tôi thực sự muốn một giải pháp từ bên trong wget để tôi có thể thấy tên chính xác khi quá trình tải xuống đang diễn ra.

Bất cứ ai có thể giúp tôi làm sáng tỏ điều này?


Gửi câu hỏi của bạn tại www.stackoverflow.com.
Deniz Zoeteman

3
@TutorialPoint tại sao? câu hỏi đang tìm kiếm một cách dễ dàng, SO sẽ di chuyển nó trở lại đây.
quack quixote

Chà, không có chuyện gì xảy ra cả
ayrnieu

1
@ayrnieu: không trong một lệnh, không. và không phải không có người trợ giúp nhưng bạn chắc chắn có thể làm điều đó với chỉ vài wgetlệnh n + 1 (nếu không ít hơn).
quack quixote

Câu trả lời:


24

Nếu máy chủ tốt, nó có thể dính tiêu đề Xử lý nội dung khi tải xuống tư vấn cho khách hàng của bạn tên tệp chính xác. Nói với wget để nghe tiêu đề đó cho tên tệp cuối cùng là đơn giản như:

wget --content-disposition

Bạn sẽ cần một phiên bản mới của wget để sử dụng tính năng này.

Tôi không biết nó xử lý tốt như thế nào khi một máy chủ yêu cầu tên tệp là '/ etc / passwd'.


Tôi không có vấn đề với câu trả lời này, vì nó không nghi ngờ gì hoạt động cho một số tình huống. Thật không may, nó không làm việc cho tôi sự tôn trọng đối với một số với CloudFront trang -served với ?v=blahloại versioning trong đó. Có thể có một số cách cụ thể trên nền tảng đám mây để yêu cầu một tài liệu mà không có những điều này, tôi không biết, nhưng tôi đã không tìm thấy một tài liệu, vì vậy một câu trả lời giống như một trong những câu trả lời khác cũng có thể cần thiết trong trường hợp như vậy. (Nếu bất cứ ai biết cách thoát y - hoặc khiến Cloudfront không phục vụ - v=chuỗi, tôi rất muốn nghe về điều đó.)
lindes

17

Tôi nhận ra sau khi xử lý một lô lớn mà đáng lẽ tôi phải hướng dẫn wgetbỏ qua các chuỗi truy vấn. Tôi không muốn làm lại từ đầu nên tôi đã tạo kịch bản này phù hợp với tôi:

# /bin/bash
for i in `find $1 -type f`
do
    mv $i `echo $i | cut -d? -f1`
done

Đặt nó trong một tệp như rmqstrchmod +x rmqstr Cú pháp:./rmqstr <directory (defaults to .)>

Nó sẽ loại bỏ các chuỗi truy vấn khỏi tất cả các tên tệp theo cách đệ quy.


2
Tôi sẽ thêm `-name" \? "` Để tìm một phần chỉ giới hạn cho các tệp cần thiết :)
Arkziusz 'fly' Rzadkowolski

4

Tôi nghĩ, để có wgetthể lưu dưới dạng tên tệp khác với URL chỉ định, bạn cần sử dụng -O filenameđối số. Điều đó chỉ thực hiện những gì bạn muốn khi bạn cung cấp cho nó một URL - với nhiều URL, tất cả nội dung được tải xuống sẽ kết thúc filename.

Nhưng đó thực sự là câu trả lời. Thay vì cố gắng làm tất cả trong một wgetlệnh, hãy sử dụng nhiều lệnh. Bây giờ quy trình làm việc của bạn trở thành:

  1. Chạy wgetđể lấy (các) tệp HTML cơ sở có chứa các liên kết của bạn;
  2. Phân tích cú pháp cho các URL;
  3. Tìm kiếm URL kết thúc bằng mp3,
    1. xử lý URL để có được tên tệp (ví dụ: biến http://foo/bar/baz.mp3?gargle=blasterthànhbaz.mp3
    2. (tùy chọn) kiểm tra xem tên tệp không tồn tại
    3. chạy wget <URL> -O <filename>

Điều đó giải quyết vấn đề của bạn, nhưng bây giờ bạn cần tìm ra cách lấy các tệp cơ sở để tìm mp3URL của mình .

Bạn có một URL trang web / cơ sở cụ thể trong tâm trí? Bước 1 và 3 sẽ dễ xử lý hơn với một ví dụ cụ thể.


1

vì vậy tôi có thể thấy tên chính xác khi quá trình tải xuống đang diễn ra.

ĐƯỢC. Sử dụng wget như bạn thường làm; sử dụng tập lệnh post-wget mà bạn thường sử dụng, nhưng xử lý đầu ra của wget để dễ nhìn hơn:

#! /bin/sh
exec wget --progress=bar:force $* 2>&1 | \
  perl -pe 'BEGIN { $| = 1 } s,(?<=`)([^\x27?]+),\e[36;1m$1\e[0m, if /^Saving/'
cgi-cut # rename files

Điều này sẽ vẫn hiển thị ?foo=barkhi bạn tải xuống, nhưng sẽ hiển thị phần còn lại của tên bằng màu lục lam sáng.


Điều này phần nào giải quyết vấn đề tên tệp được hiển thị, nhưng OP cũng muốn tên tệp cuối cùng không có chuỗi truy vấn.
Michael Mior

1

Tôi có một cách tiếp cận tương tự như @Gregory Wolf vì mã của anh ấy luôn tạo ra các thông báo lỗi như thế này:

mv: './file' và './file' là cùng một tệp

Vì vậy, trước tiên tôi kiểm tra xem có một chuỗi truy vấn trong tên tệp trước khi di chuyển tệp không:

for f in $(find $1 -type f); do
    if [ $f = ${f%%\?*} ]; then continue; fi
    mv "${f}" "${f%%\?*}"
done

Điều này sẽ kiểm tra đệ quy mọi tệp và xóa tất cả các chuỗi truy vấn trong tên tệp của chúng nếu có.


0

Nhìn vào hai lệnh tôi đã tạo để sao chép một trang web và sau khi sao chép xong, bạn có thể thực hiện lệnh thứ hai.

Lệnh thứ hai sẽ xem xét toàn bộ bản sao, tìm kiếm tên mẫu tệp " ? " Và sẽ xóa chuỗi truy vấn khỏi tên tệp.

# Clone entire site.
    wget --content-disposition --execute robots=off --recursive --no-parent --continue --no-clobber http://example.com

# Remove query string from a static resource.
for i in `find $1 -type f -name "*\?*"`; do mv $i `echo $i | cut -d? -f1`; done

(Xem nó trong GitHub Gist .)


-2

Thậm chí còn dễ hơn thế này: /unix/196253/how-do-you-rename-files-specifically-in-a-list-that-wget-will-use

Điều này cho thấy một phương pháp chủ yếu sử dụng chức năng đổi tên của wget (có thể được thay đổi để bao gồm thư mục) cho nhiều tệp. Xem phiên bản thứ hai được đề xuất.


2
Bạn có thể vui lòng trích dẫn thông tin liên quan từ liên kết, để chúng tôi biết tài liệu nào, bạn tin rằng câu trả lời cho câu hỏi này.
Ramhound
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.