Câu hỏi Bash: thay đổi mức độ tập tin của tất cả các tệp trong một thư mục và sao chép các dòng lẻ


Làm thế nào sẽ đi về lấy tất cả các *.txt các tệp trong một thư mục cụ thể (người dùng nhập) và sao chép các dòng lẻ vào các tệp có tên giống nhau nhưng có đuôi mở rộng khác nhau (bat / html hoặc bất kỳ thứ gì khác)

Tôi cho rằng cp hoặc là mv không làm việc, một cái gì đó như sed nên làm các thủ thuật cho các dòng, nhưng im có một thời gian khó khăn kết hợp tất cả mọi thứ với nhau.

Nếu bất cứ ai có thể giúp tôi ghép chúng lại với nhau, tôi sẽ rất biết ơn

#!/bin/bash
clear

#seems like a good idea to get a full path to the directory im gonna be working in, not #sure how to go about it though. 

path=pwd

#getting users input

read Directory

#check if said directory exists
if[ -d $Directory]; then
#if it does
#all files with .txt extention are to be copied 
for *.txt in $(ls)
do
mv *.txt *.bat

#aaand now im lost, didnt have a chance to even test this, since i have linux only in #my studying enviroment (uni), will get on my personal PC later on
#something like sed could/should work in there, but i have no idea how to go about it

#if doesnt
else
echo "Directory does not exist or you do not have a permission to alter its contents"

1
2017-12-15 23:15


gốc


Bạn có muốn di chuyển các dòng lẻ vào một tệp hoặc thành các tệp khác nhau không? - kiri
Tôi muốn sao chép các dòng lẻ thành các tệp khác nhau. Ví dụ: 1.txt -copy các dòng lẻ đến-> 1.bat - user225827


Các câu trả lời:


#!/bin/sh 
cd "$1" || { echo "Couldn't cd to directory $1.  Quitting." ; exit 1 ; } 
for fname in *.txt
do
    awk 'NR % 2 == 1 { print; }' "$fname" >"${fname%.txt}.bat"
done

Đặt ở trên trong một tập tin và làm cho tập tin thực thi (chmod +x yourfilename). Bây giờ, hãy chạy lệnh này với thư mục mà bạn muốn hoạt động với tư cách đối số đầu tiên.

Tập lệnh thay đổi thành thư mục bạn yêu cầu (cd "$1"). Nếu không thành công (thư mục không tồn tại), thì tập lệnh sẽ thoát với thông báo lỗi. Nếu cd "$1" thành công, sau đó kịch bản đi qua từng .txt trong thư mục, chọn các dòng lẻ (NR % 2 == 1) và ghi chúng vào một tệp có cùng tên ngoại trừ phần mở rộng ".bat".


3
2017-12-15 23:24



Cảm ơn! Có vẻ rất đơn giản bây giờ mà tôi nhìn vào nó Có để tìm kiếm awk, kể từ khi im không quen thuộc với lệnh này - user225827


Không chắc chắn ý của bạn là "các dòng lẻ" [1], nhưng câu lệnh này chỉ đạt được những gì mã của bạn hiện đang cố gắng thực hiện:

cd "$1" && rename 's/\.txt$/.bat/' *.txt

Không cần phải làm thông báo lỗi của riêng bạn, trình bao sẽ làm chúng tốt.

[1] Điều này làm cho nó giống như một bài tập về nhà của Uni.


0
2017-12-16 07:41



các dòng lẻ từ các tập tin .txt im đổi tên. Khá nhiều là, đã có C tất cả học kỳ mà tôi đã được làm quen với trước khi uni, vì vậy hoàn thành tất cả các bài tập C, có một kịch bản một để làm quen với Unix. Rất nhiều điều cần tìm hiểu, và sau C / C ++ và một số hội, làm mọi thứ trên toàn cầu theo loại, thay vì lặp qua tất cả các yếu tố một-by-một là một khái niệm mới mà tôi cần làm quen. Chúc mừng! - user225827


Cảm ơn tất cả những gì đã trả lời, bạn đã giúp tôi rất nhiều trong việc đạt được một số hiểu biết về bash scripting, bây giờ câu hỏi này đã được giải quyết, làm thế nào một người sẽ đi về việc đóng một câu hỏi?

Tôi đã sử dụng tập lệnh do John1024 cung cấp, hoạt động hoàn hảo. Rất nhiều cho điều đó. Chúc mừng

! / bin / sh

cd "$ 1" || {echo "Không thể cd vào thư mục $ 1. Thoát." ; thoát 1; } cho fname trong * .txt làm     awk 'NR% 2 == 1 {print; } '"$ fname"> "$ {fname% .txt} .bat" làm xong


-1
2017-12-19 22:14



Nếu câu trả lời được đưa ra bởi @ John1024 làm việc cho bạn thì hãy chấp nhận nó thay vì thêm lời cảm ơn của bạn như là một "câu trả lời" - xem askubuntu.com/help/accepted-answer - steeldriver