Đổi tên các tệp được tải xuống thông qua wget --mirror Cảnh sát ở Bash trước khi tải lên khu vực được lưu trữ tĩnh trên Amazon S3


1

Tôi đang cố lưu trữ và tải lên một trang web cũ lên khu vực Amazon S3 được lưu trữ tĩnh.

Tôi đã có thể nhận được nội dung với wget, sử dụng lệnh sau:

wget --mirror --no-parent --html-extension --page-requisites http://original.com

Sau đó, tôi có thể thay thế tất cả các liên kết đến URL mới của họ, bằng cách:

ag -l original\.com -0 | xargs -0 sed -i '' \
's|original.com|old.original.com|g'

Sau này, tôi đã tải trang web lên Amazon S3 bằng cách sử dụng s3cmd sync.

Vấn đề duy nhất của tôi bây giờ là tất cả các tài sản trên nền tảng bộ nhớ cache của bộ nhớ cache hiện đang bị từ chối truy cập trên Amazon. Vấn đề là wgetcó các tệp có tham số truy vấn được bao gồm trong tên tệp của họ và tôi sẽ cần đổi tên chúng.

Vì vậy, tôi muốn đổi tên các tệp đệ quy, trong tất cả các thư mục con, như:

  • style.css?ver=4.2.5.css được đổi tên thành style.css

Làm cách nào tôi có thể làm điều đó trong Mac OS X bằng Bash 3.2?

Câu trả lời:


1

Điều này sẽ làm việc:

find . -maxdepth 1 -type f -name '*\?*' |\
  while read FILENAME
  do
    IFS='?'
    SPLIT_FILENAME=(${FILENAME})
    unset IFS
    echo mv "${FILENAME}" "${SPLIT_FILENAME}"
    # mv "${FILENAME}" "${SPLIT_FILENAME}"
  done

Chỉ find .ra tất cả các hành động xảy ra trong thư mục hiện tại cũng như các thư mục con; cảm thấy thoải mái để thay đổi đó .là filepath đầy đủ / thực tế của những gì bạn đang hành động. Việc -name '*\?*'tìm kiếm các tệp có dấu chấm hỏi ( ?) trong tên của nó.

Phiên bản ban đầu / bản demo này cũng có một -maxdepthbộ thành 1 1 vì vậy quá trình này không vượt quá tầm kiểm soát trên hệ thống tập tin của bạn và nó sử dụng một echophiên bản của lệnh để cho bạn biết những gì nó sẽ làm trước khi bạn thực sự chạy nó.

Nếu bạn chạy rằng đầu ra có vẻ tốt, hãy thoải mái điều chỉnh -maxdepth 1thành một cái gì đó giống -maxdepth 9hoặc thậm chí loại bỏ hoàn toàn và sau đó nhận xét echodòng và bỏ ghi chú mvdòng để nó trông như thế này:

find . -type f -name '*\?*' |\
  while read FILENAME
  do
    IFS='?'
    SPLIT_FILENAME=(${FILENAME})
    unset IFS
    # echo mv "${FILENAME}" "${SPLIT_FILENAME}"
    mv "${FILENAME}" "${SPLIT_FILENAME}"
  done

Sử dụng ví dụ về tệp thử nghiệm của bạn style.css?ver=4.2.5.css, tôi đã nhận được kết quả đầu ra này khi chạy tập lệnh này trên hệ thống Mac OS X 10.9.5 (Mavericks) của tôi:

mv ./style.css?ver=4.2.5.css ./style.css

Có vẻ như một chuyển đổi tốt cho tôi. Chạy nó với mvlệnh thực và tệp đã được đổi tên thành style.css. Điều này cũng sẽ làm việc với các tệp có không gian trong đó, chẳng hạn như các tệp thử nghiệm như this is my style.css?ver=4.2.5.cssmy style.css?ver=4.2.5.css.


1

Điều này sẽ hoạt động trên Mac OS X với giả sử chỉ có một tên ?trên URL / tên tệp gốc:

find . -name "*\?*" -exec sh -c 'var="{}" ; mv "{}" "${var%\?*}"' \;

Để tham khảo, điều này cũng sẽ hoạt động tốt trên các hệ thống Linux hay bất kỳ hệ thống nào có renamecài đặt công cụ:

find . -name "*\?*" -exec rename "s/\?.*//" "{}" \;

renamekhông tồn tại trong Mac OS X.
JakeGould

Chạy lệnh của bạn trong Mac OS X cho kết quả là: Tìm kiếm: đổi tên: Không có tệp hoặc thư mục nào như vậy
JakeGould

Tôi tin rằng nếu bạn đề cập đến "brew install đổi tên" thì đó sẽ là một câu trả lời hợp lệ cho OS X.
hyperjack

@zsero Tôi không ghét Homebrew, nhưng vấn đề với Homebrew đối với hầu hết mọi người là, brew install renameđó không phải là điều mà hầu hết người dùng có thể làm mà không cần phải nâng vật nặng. Đầu tiên, Homebrew yêu cầu Xcode (tải xuống 4GB +) và các công cụ dòng lệnh liên quan được cài đặt. Sau đó, Homebrew cần phải được cài đặt. Và chỉ sau đó có brew install [something]vẻ thanh lịch. Nhiều người dùng bình thường hơn không cần một giải pháp đơn giản sẽ không đi vào con đường đó để giải quyết một vấn đề đơn giản có thể được xử lý thông qua các công cụ đã là một phần của Mac OS X.
JakeGould

Bạn thực sự có thể sử dụng $ 1, theo cách đó sẽ thanh lịch hơn, không cần var.
hyperjack

-1

Tôi sẽ sử dụng tiếng vang để chứng minh.

# echo 'style.css?ver=4.2.5.css' | cut -d? -f2-9999
ver=4.2.5.css

Đệ quy:

cd <yourdir>
for f in *; do
    newf=$( echo $f | cut -d? -f2-9999 )
    mv $f $newf
done

Giả định: <yourdir>chỉ chứa các tệp mà bạn muốn thay đổi. Nếu không, thay đổi toàn for f in *cầu cho phù hợp. Bạn nên kiểm tra lệnh cuối cùng trước bằng echo, tức là thay thế mv $f $newfbằng echo $f $nfvà đảm bảo nó thực hiện những gì bạn muốn.


1
Phương thức của bạn sẽ đổi tên tệp ( style.css?ver=4.2.5.css) thành ver=4.2.5.cssnhưng đó không phải là mục tiêu của câu hỏi của người gửi ban đầu.
JakeGould

Vâng. Tôi cho rằng tôi nên đã viết 'cut -d? -f1 '.
Erik Bryer
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.