প্রত্যয় যুক্ত করতে ফাইলগুলির পুনরায় নামকরণ করা হচ্ছে


13

আমার বর্তমান কমান্ড ডিরেক্টরিতে সমস্ত ফাইলের নাম বদলে দেওয়ার জন্য একটি কমান্ড দরকার, যাতে নতুন ফাইলের নাম পুরানো হিসাবে একই হয় তবে মূল ফাইলগুলির লাইন সংখ্যার সাথে প্রত্যয় সহ (যেমন ফাইলের f10 থাকে) লাইনগুলি তখন এর নামকরণ করা উচিত f_10)।

এখানে আমার (অ-কর্মক্ষম) প্রচেষ্টা:

 linenum=$(wc -l); find * -type f | grep -v sh | rename 's/^/ec/'*

আপনি যে একটি উত্তর দিতে পারে! (যদি এটি বিদ্যমান উত্তরের সাথে নতুন কিছু যুক্ত করে - তবে এটি দেখে মনে হয়)
ভলকার সিগেল

উত্তর:


13

কেমন:

for f in *; do mv "$f" "$f"_$(wc -l < "$f"); done

উদাহরণ স্বরূপ:

$ wc -l *
 10 file1
 40 file2
100 file3
$ ls
file1_10  file2_40  file3_100

আপনি যদি এক্সটেনশানগুলি রাখতে চান (উপস্থিত থাকলে), পরিবর্তে এটি ব্যবহার করুন:

for f in *; do 
    ext=""; 
    [[ $f =~ \. ]] && ext="."${f#*.}; 
    mv "$f" "${f%%.*}"_$(wc -l < "$f")$ext; 
done

থার্ডন ধন্যবাদ! এই কমান্ড লাইনের কাজ শেষ হয়ে গেছে বলে মনে হচ্ছে তবে আমি কীভাবে বিন্দু (।) (()) এ পরিবর্তন করতে পারি? এছাড়াও, আমার স্ক্রিপ্টটি ফোল্ডারের অভ্যন্তরে থাকায় এটিও নতুন নামকরণ করা হয়েছে এবং তাই আমার স্ক্রিপ্টটি একবার সম্পাদন করার অনুমতি দেয় (কারণ স্ক্রিপ্টের নাম পরিবর্তন হয় ...)
মার্টিন ইয়েবোাহ

@ মার্টিনইবোবো এর জন্য আপডেট উত্তর দেখুন _। স্ক্রিপ্ট হিসাবে, কোন স্ক্রিপ্ট? এটি কমান্ড লাইন থেকে চালানো উচিত, স্ক্রিপ্টের দরকার নেই। আপনি যদি এটি কেবল কিছু ফাইলের সাথে মেলে চান তবে in *উদাহরণস্বরূপ, in *txtবা অন্য কোনওটিতে এটি পরিবর্তন করুন ।
টেরডন

অনেক অনেক ধন্যবাদ;) আমি পুরোপুরি ভুলে গিয়েছিলাম যে কমান্ড লাইন থেকে এটি কার্যকর করা উচিত :)
মার্টিন ইয়েবোহ

আমি মনে করি wc -l < $fগ্রেপের পরিবর্তে বোঝা সহজ হবে (এবং সম্পাদন করা আরও ভাল তবে আমি এটি পরীক্ষা করে দেখিনি)।
musiKk

@ মুসিকেক হ্যাঁ, তবে যেহেতু অন্যান্য উত্তরগুলি ব্যবহার করছে wc, তাই আমি একটি ভিন্ন পন্থা দেখাতে চেয়েছিলাম। তবে ঠিক আছে, যথেষ্ট ন্যায্য।
টেরডন

10

আপনি এই একটি লাইনার চেষ্টা করতে পারেন:

find . -maxdepth 1 -type f -exec bash -c 'mv -i "$1" "$1.$(wc -l <"$1")"' _ {} \;
  • এটি বর্তমান ওয়ার্কিং ডিরেক্টরিতে সমস্ত ফাইল খুঁজে পাবেন ( find . -maxdepth 1 -type f)

  • তারপরে আমরা লাইনের সংখ্যা সংযোজন করার জন্য ফাইলগুলির নাম পরিবর্তন করতে পাওয়া ফাইলগুলির ওপরে একটি শেল ঘটনা চালাচ্ছি।

উদাহরণ:

$ ls
bar.txt spam.txt foo.txt

$ find . -maxdepth 1 -type f -exec bash -c 'mv -i "$1" "$1.$(wc -l <"$1")"' _ {} \;

$ ls
bar.txt.12 foo.txt.24 spam.txt.7

6

আর একটি উপায় যা ব্যবহার করে এক্সটেনশনটি সংরক্ষণ করে (উপস্থিত থাকলে) rename:

for f in *; do rename -n "s/([^.]+)(\.?.*)/\$1_$(< "$f" wc -l)\$2/" "$f"; done

ফলাফলটি যদি প্রত্যাশিত হয় তবে -nবিকল্পটি সরিয়ে ফেলুন :

for f in *; do rename "s/([^.]+)(\.?.*)/\$1_$(< "$f" wc -l)\$2/" "$f"; done

renameদুর্দান্ত =) +1
এবি

1
এটি কি এসসিডিতে ব্যর্থ হবে না? দ্বিতীয় ক্যাপচার গ্রুপটিতে পরিবর্তন করুন (\.?[^\.]+)
PS95

@ prakarsingh95 এটি সত্য, তবে (\.?[^\.]+)তা ঠিক নেই কারণ এটি কেবল দ্বিতীয় বিন্দু পর্যন্ত মেলে এবং একটানা বিন্দু সহ কোনও ফাইলের সাথে মিলবে না বা নির্বিশেষে একটি বিন্দুর সাথে শেষ হবে না। এটি কোনও সহজ সমাধান কঠিন নয়, একমাত্র উপায় দুটি বিকল্পের জন্যই মনে হয়।
kos

@ কোস আপনি সঠিক আছেন কীভাবে ([^ \।] +)। *? ([[^ \।]] + $) অনুকূলতা সম্পর্কে আমি নিশ্চিত নই। ফ্রিলিং
PS95

1
@ প্রখরসিংহ 95 আপনি .চরিত্রের ক্লাসের মধ্যেই পালাতে চান না ।
টেরডন

5

ব্যবহার find:

find . -maxdepth 1 -type f -print0 | while read -d $'\0' f; do mv "$f" "$f"_$(grep -c . "$f"); done

উদাহরণ

% wc -l *
  3 doit
  5 foo

% find . -maxdepth 1 -type f -print0 | while read -d $'\0' f; do mv "$f" "$f"_$(grep -c . "$f"); done

% wc -l *                         
  3 doit_3
  5 foo_5

কেন -name "*"? টেস্ট থেকে বাঁচা? ;)
কোস

1
@ কোস পুরানো অভ্যাস: \
এবি

3

কেবল মজাদার জন্য এবং এর সাথে একটি সমাধান জিগল করে rename। যেহেতু renameপার্ল হাতিয়ার যা একটি স্বেচ্ছাসেবী স্ট্রিং গ্রহণ করে যা বিস্তৃত হয়, তাই আপনি সমস্ত ধরণের শেনানিগ্যান করতে পারেন। একটি সমাধান যা কাজ করে বলে মনে হচ্ছে তা হল:

rename 's/.*/open(my $f, "<", $_);my $c=()=<$f>;$_."_".$c/e' *

আকর্ষণীয় ধারণা +1
এবি

2

স্ক্রিপ্ট বেলো একাধিক কেস কভার করে: একক বিন্দু এবং এক্সটেনশন (ফাইল ডটেক্সট), একাধিক বিন্দু এবং এক্সটেনশান (ফাইল.1.txt), একটানা বিন্দু (ফাইল..ফুবার.টেক্সট), এবং ফাইলের নাম (ফাইল। বা ফাইল ..)।

এই পান্ডুলিপি

#!/bin/bash
# Author: Serg Kolo
# Date:  June 25,2015
# Description: script to rename files to file_numlines
# written for http://askubuntu.com/q/640430/295286

# Where are the files ?
WORKINGDIR=/home/xieerqi/substitutions
# Where do you want them to go ?
OUTPUTDIR=/home/xieerqi/substitutions/output

for file in $WORKINGDIR/* ;do 
    FLAG=0
    EXT=$(printf "%s" "$file" | awk -F'.' '{printf "%s",$NF }' )  # extension, last field of dot-separated string
    # EXT="${file##*.}" # Helio's advice is to use parameter expansion, but I dont know how to use it
    if [ -z $EXT ]; then # we have a dot at the end case file. or something
        # so we gotta change extension and filename
        EXT=""
        FILENAME=$(printf "%s" "$file" | awk -F '/' '{ print $NF}' )
        # set flag for deciding how to rename
        FLAG=1
    else
        FILENAME=$( printf "%s" "$file" | awk -F '/' -v var=$EXT '{gsub("."var,"");print $NF}'   ) # filename, without path, lst in
    fi

    NUMLINES=$(wc -l "$file" | awk '{print $1}') # line count

    if [ $FLAG -eq 0 ];then
         echo "$file" renamed as "$OUTPUTDIR"/"$FILENAME"_"$NUMLINES"."$EXT"
        # cp "$file" "$OUTPUTDIR"/"$FILENAME"_"$NUMLINES"."$EXT" # uncomment when necessary
    else
        echo "$file" renamed as "$OUTPUTDIR"/"$FILENAME"_"$NUMLINES""$EXT"
        # cp "$file" "$OUTPUTDIR"/"$FILENAME"_"$NUMLINES""$EXT" # uncomment when necessary
    fi

    #printf "\n"

done

কার্যক্রমে স্ক্রিপ্ট

$./renamer.sh                                                                                                           
/home/xieerqi/substitutions/file. renamed as /home/xieerqi/substitutions/output/file._0
/home/xieerqi/substitutions/file.. renamed as /home/xieerqi/substitutions/output/file.._0
/home/xieerqi/substitutions/file.1.jpg renamed as /home/xieerqi/substitutions/output/file.1_3.jpg
/home/xieerqi/substitutions/file.1.test.jpg renamed as /home/xieerqi/substitutions/output/file.1.test_3.jpg
/home/xieerqi/substitutions/file.1.test.txt renamed as /home/xieerqi/substitutions/output/file.1.test_2.txt
/home/xieerqi/substitutions/file.1.txt renamed as /home/xieerqi/substitutions/output/file.1_2.txt
/home/xieerqi/substitutions/file.2.jpg renamed as /home/xieerqi/substitutions/output/file.2_3.jpg
/home/xieerqi/substitutions/file.2.test.jpg renamed as /home/xieerqi/substitutions/output/file.2.test_3.jpg
/home/xieerqi/substitutions/file.2.test.txt renamed as /home/xieerqi/substitutions/output/file.2.test_2.txt
/home/xieerqi/substitutions/file.2.txt renamed as /home/xieerqi/substitutions/output/file.2_2.txt
/home/xieerqi/substitutions/foo..bar.txt renamed as /home/xieerqi/substitutions/output/foo..bar_4.txt

নোট করুন যে ফাইলটিতে কোনও লাইন নেই। এবং ফাইল .., সুতরাং লাইন গণনা 0 হয়

স্ক্রিপ্ট এবং প্রস্তাবিত সম্পাদনাগুলি পর্যালোচনা করার জন্য টেরডন এবং হেলিওকে বিশেষ ধন্যবাদ


2

@ হেলিওর সাথে চ্যাটে উন্নত করা হয়েছে এমন আরও একটি বাশ উপায় :

for file in *
do
    echo "$file"
    [[ -f "$file" ]] || continue
    [[ $file =~ (.*)(\.[^.]+)$ ]]
    cp "$file" "output/${BASH_REMATCH[1]:-$file}_$(wc -l < "$file")${BASH_REMATCH[2]}"
done

স্টান্টেড সেকেন্ড হেডযুক্ত অদ্ভুত চেহারাযুক্ত একচেটিয়া লোকটির সাথে (.*)(\.[^.]+)$কেবল সঠিক এক্সটেনশনের সাথে মিল রাখা উচিত ( .foo, না ..)। যদি কোনও এক্সটেনশন না থাকে তবে BASH_REMATCHঅ্যারেটি খালি থাকবে। আমরা ফাইলের নামের জন্য একটি ডিফল্ট মান ব্যবহার করে ${BASH_REMATCH[1]:-$file}এবং কেবল এক্সটেনশনটি ব্যবহার করে এর সুবিধা নিতে পারি ।

ডট ফাইলগুলি পরিচালনা করতে, আপনি টেরডন এবং হেলিওয়েরfind পরামর্শ অনুসারে ব্যবহার করতে পারেন ।

find -maxdepth 1 -type f -printf '%P\0' | 
while IFS= read -r -d '' file
do
    [[ $file =~ (.*)(\.[^.]+)$ ]]
    cp "$file" "output/${BASH_REMATCH[1]:-$file}_$(wc -l < "$file")${BASH_REMATCH[2]}"
done

+1: কমান্ডের জন্য আমি কোনও ব্যাখ্যা করতে সক্ষম হব না। ;-)
হেলিও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.