লিনাক্স: ফাইলের নাম পরিবর্তন করুন কিন্তু এক্সটেনশন রাখবেন?


10

উইন্ডোজ / ডসগুলিতে, আমি rename myfile.* yourfile.*নামটি পরিবর্তন করতে বলতে পারি তবে এক্সটেনশনটি রাখতে পারি। এটি লিনাক্সে কীভাবে সম্পন্ন হয়?

ম্যান পেজটি কেবলমাত্র কীভাবে এক্সটেনশানটি পরিবর্তন করতে হবে তা পরামর্শ দেয়, তবে এটি আমি যা চাই তার বিপরীতে।

বোনাস:
আমি আসলে কোনও ফটোগুলির তৈরির তারিখটিকে এর ফাইলনামে রাখতে চাই, এর মতো কিছু পেতে 20091231 2359 New Year.jpg। আমি ভীত যে এটি অর্জনের জন্য আমার কিছু তুচ্ছ কম্যান্ডের সমন্বয় প্রয়োজন?

উত্তর:


14

বোনাস প্রশ্নের উত্তর এখানে।

20091231 2359 নতুন বছর.jpg এর মতো কিছু পেতে আমি আসলে একটি ফাইলের তৈরি তারিখটিকে তার ফাইল নামটিতে রাখতে চাই name আমি ভীত যে এটি অর্জনের জন্য আমার কিছু তুচ্ছ কম্যান্ডের সমন্বয় প্রয়োজন?

EXIF ডেটা থেকে আপনি ছবির তৈরির তারিখটি নিতে চাইছেন ধরে নেওয়া, আপনার জন্য এটির জন্য একটি পৃথক সরঞ্জাম প্রয়োজন। ভাগ্যক্রমে দেখা যাচ্ছে যে jheadএটির -nবিকল্প হিসাবে আপনি যা চান ঠিক তা করতে একটি তুচ্ছ উপায় উপস্থাপন করে ।

$ jhead -h
 [...]

 -n[format-string]

             Rename files according to date.  Uses exif date if present, file
             date otherwise.  If the optional format-string is not supplied,
             the format is mmdd-hhmmss.  If a format-string is given, it is
             is passed to the 'strftime' function for formatting
             In addition to strftime format codes:
             '%f' as part of the string will include the original file name
             [...]

এখানে একটি উদাহরণ:

$ jhead -n%Y-%m-%d-%f New_year.jpg   
New_year.jpg --> 2009-12-31-New_year.jpg

সম্পাদনা : অবশ্যই একগুচ্ছ ফটোগুলির জন্য এটি করার জন্য এটি এমন কিছু হবে:

$ for i in *jpg; do jhead -n%Y-%m-%d-%f $i; done

আপনার পছন্দ অনুসারে তারিখের বিন্যাসটি সামঞ্জস্য করতে date --help, উদাহরণস্বরূপ আউটপুটটি একবার দেখুন ; এটি উপলব্ধ ফর্ম্যাট কোডগুলি তালিকাভুক্ত করবে।

(jhead বিভিন্ন সিস্টেমের জন্য প্রচুর পাওয়া যায়। আপনি উবুন্টু বা ডেবিয়ান উপর যেমন হন, কেবল টাইপ sudo apt-get install jheadএটি ইনস্টল করা।)


1
আমি জেথের কথা ভাবি নি, কেবল নাম পরিবর্তন, স্ট্যাট এবং কাটা মিশ্রণের কুৎসিত সমন্বয়। মহান উত্তরের জন্য আপনাকে ধন্যবাদ!
টরবেন গুন্ডটোফেট-ব্রুন

10

কেবল নামকরণের অংশের জন্য, 'পুনর্নামকরণ' প্রোগ্রামটি কাজ করবে। এটি ম্যান পৃষ্ঠাতে আপনি যে উদাহরণটি দেখেছেন ঠিক একইরকম, সবেমাত্র বদলে গেছে।

justin@eee:/tmp/q$ touch myfile.{a,b,c,d}
justin@eee:/tmp/q$ ls
myfile.a  myfile.b  myfile.c  myfile.d
justin@eee:/tmp/q$ rename -v s/myfile/yourfile/ myfile.*
myfile.a renamed as yourfile.a
myfile.b renamed as yourfile.b
myfile.c renamed as yourfile.c
myfile.d renamed as yourfile.d
justin@eee:/tmp/q$ ls
yourfile.a  yourfile.b  yourfile.c  yourfile.d
justin@eee:/tmp/q$ 

1
কিছু ডিস্ট্রোজে, এই পার্লের পুনর্নামকরণ প্রোগ্রামটিকে পূর্ব নাম বলা হয়।
ক্যামে

এটি সত্যিই দরকারী! "পুনরায় নামকরণ" সন্ধানের আগে আমাকে এই ধরণের কতগুলি প্রশ্নের সন্ধান করতে হয়েছিল তা দেখে আমি অবাক হয়েছি। ধন্যবাদ.
17

7
betelgeuse:tmp james$ ls myfile.* yourfile.*
ls: yourfile.*: No such file or directory   
myfile.a    myfile.b
betelgeuse:tmp james$ for file
> in myfile.*
> do
> mv "${file}" "`echo $file | sed 's/myfile\./yourfile./'`"
> done
betelgeuse:tmp james$ ls myfile.* yourfile.*
ls: myfile.*: No such file or directory
yourfile.a  yourfile.b

মূলটি হ'ল, যদি আপনি এমন একটি উদাহরণ দেখে থাকেন যা দেখায় যে কীভাবে ফাইলের নামের একটি অংশকে একটি রেজেেক্সের সাথে ছাঁটাই করতে হয়, তবে এটিই আপনার প্রয়োজন একমাত্র উদাহরণ। ইউনিক্স ফাইল সিস্টেমে এক্সটেনশনের কোনও বিশেষ স্ট্যাটাস নেই - এগুলি ফাইলের নামের একটি অংশ যা কোনও .চরিত্রের পরে ঘটে ।


1
এটি আমার প্রশ্নের উত্তর। (তবে অন্য উত্তরটি আমাকে সেখানে দ্রুত এবং সহজতর করে দেয়))
টরবেন গুন্ডটোফেট-ব্রুন

4
কাঁটাচামচ + + Exec করার কোন প্রয়োজন নেই sed: mv "$file" yourfile"${file#myfile}"। আধুনিক বোর্নের মতো কোনও শেল (বা কোনও পসিক্স শেল) নিয়ে কাজ করে, তবে সম্ভবত আসল বোর্ন শেলটি নয়।
ক্রিস জনসেন

4

ফাইলের নামগুলি চালিত করার আরও কয়েকটি ভিন্ন উপায় এখানে

for f in *.jpg
do
    mv "$f" "before_part${f%.*}after_part.${f##*.}"
    # OR mv "$f" "before_part$(basename "$f" ".jpg")after_part.jpg"
done

পরামিতি প্রসারণও মধ্যে mvকমান্ড কাজ নিম্নরূপ:

${f%.*}- অন্তর্ভুক্ত স্ট্রিংয়ের শেষে থেকে সংক্ষিপ্ততম মিলের প্যাটার্নটি মুছুন, $fএক্ষেত্রে শেষ বিন্দুর পরে এবং সমস্ত কিছু মুছুন। একক %"শেষ থেকে সবচেয়ে কম" অর্থ।

${f##*.}- অন্তর্ভুক্ত স্ট্রিংয়ের শুরু থেকে দীর্ঘতম মিলনের প্যাটার্নটি মুছুন $f, এক্ষেত্রে শেষ বিন্দুটির আগে এবং অন্তর্ভুক্ত সবকিছু (এটিতে অন্য কোনও বিন্দুও অন্তর্ভুক্ত রয়েছে)। দ্বিগুণ #( ##) এর অর্থ "শুরু থেকে দীর্ঘতম"।

সুতরাং, উদাহরণস্বরূপ, যদি $fএতে "Foo.bar.baZ.jpg" থাকে:

echo "${f%.*}"

দেয়

Foo.bar.baZ

এবং

echo "${f##*.}"

দেয়

jpg

সুতরাং mvকমান্ডটি একবার প্রসারিত হবে:

mv "Foo.bar.baZ.jpg" "before_partFoo.bar.baZafter_part.jpg"

আমি প্রকৃতপক্ষে ফর লুপটি ব্যবহার করেছি তবে এমভি উদাহরণটি ব্যবহার করে না কারণ আমি এটি বুঝতে পারি না :-)
টোরবেন গুন্ডটোফেট-ব্রুন

দ্রষ্টব্য: সেগুলির অর্থ f%এবং f##এখানে বর্ণিত হয়েছে, উদাহরণস্বরূপ: tldp.org/LDP/abs/html/parameter-substedia.html
Torben Gundtofte-Bruun

3

লিনাক্সে কোনও ফাইল নাম এক্সটেনশন নেই।

ফাইলের নাম থেকে নির্দিষ্ট সাবস্ট্রিংগুলি কাটতে এবং এগুলিতে অ্যাক্সেস করতে নিয়মিত এক্সপ্রেশন ব্যবহার করুন।

উদাহরণ:

বাস্তব জীবনের দৃশ্য: আপনি একটি chm ফাইল থেকে এইচটিএমএল উত্তোলন করছেন। উইন্ডোজের ফাইলের নামগুলি কেস-সংবেদনশীল, তাই লিনাক্সে আপনি ভাঙা লিঙ্ক পাবেন। আপনার সূচী নামে একটি ফাইল আছে H এইচটিএমএল , তবে ইউআরএলতে href = "index.html" । সুতরাং আপনার লক্ষ্য হ'ল ফাইল নামগুলির সাথে লিঙ্কগুলি মেলানোর জন্য অভিযোজিত।

ধরুন আপনার একটি ভেরিয়েবলের ফাইলের নাম রয়েছে:

FILENAME='index.HTML'

সংস্করণ with.০ ব্যাশ দিয়ে শুরু করা নিজেই নিয়মিত প্রকাশকে সমর্থন করে, সুতরাং স্ট্রিং ম্যানিপুলেশন সম্পাদনের জন্য আপনার কোনও অতিরিক্ত সরঞ্জাম যেমন গ্রেপ / সেড / পার্ল ইত্যাদি প্রয়োজন নেই। নিম্নলিখিত উদাহরণটি একটি স্ট্রিংয়ে ব্যাক-এন্ড ম্যাচের প্রতিস্থাপনের চিত্র দেয়:

echo ${FILENAME/%\.HTML/.html}

ম্যাচ এবং রিপ্লেসমেন্ট স্ট্রিংগুলি প্যারামিট্রাইজ করা যেতে পারে যদি আপনি চান, স্ক্রিপ্ট লেখার সময় এটি অতিরিক্ত নমনীয়তা সরবরাহ করে। নিম্নলিখিত কোড স্নিপেট একই লক্ষ্য অর্জন করে:

match='\.HTML'
replacement='.html'
echo ${FILENAME/%$match/$replacement}

অতিরিক্ত তথ্যের জন্য ব্যাশ ডক্সের সাথে পরামর্শ করুন।


1
এই নিয়মিত প্রকাশের কোনও উদাহরণ?
জ্ঞাপি

+1 টি। এই উত্তরটি এখন খুব দরকারী (সম্পাদনার পরে) - আপনি বাশে এই জাতীয় স্ট্রিং ম্যানিপুলেশন করতে পারবেন এমন আমার কোনও ধারণা ছিল না।
জোনিক

উদাহরণস্বরূপ, এখন আরও অনেক ভাল much +1
জ্ঞানপি


0

এটি করার একাধিক উপায় সবসময় আছে। আমি নীচের স্ক্রিপ্টটি / ইউএসআর / লোকাল / বিন / মেরেনাম হিসাবে রেখেছি।

তারপরে ফটো স্ক্রিপ্টগুলিতে থাকা স্ক্রিপ্টে কেবল টাইপ করুন: মেনাম

ফটোগুলি স্কেল করতে ইমেজম্যাগিক ব্যবহার করে স্ক্রিপ্টে একটি comচ্ছিক মন্তব্য-আউট বৈশিষ্ট্যও রয়েছে।

আশা করি এটি কিছু লোকের জন্য কার্যকর।

#!/usr/bin/perl
#
# mrename files
#
#
use strict;

# if no 2 args, use defaults
my $dir = ".";

# read in path from command line
$dir = $ARGV[0] if ( defined( $ARGV[0] ) && $ARGV[0] ne "" );

# read in directory contents
opendir( DIR, $dir );
my @files = readdir( DIR );
closedir( DIR );

# rename and/or scale each file in directory
my $number_of_files = scalar( @files );
my $curfile = 0;

foreach my $file( @files ) {
    # only rename and scale jpg/gif files
    if ( $file =~ /\w+\.(jpg)$/ ) {
        my $extension = $1;
        $extension =~ tr/A-Z/a-z/;
        my $full_filename = "$dir/$file";

        # get stats on file- specifically the last modified time
        (my $dev,my $ino,my $mode,my $nlink,my $uid,my $gid,my $rdev,my $size,
        my $atime,my $mtime,my $ctime,my $blksize,my $blocks) = stat($full_filename);

        # convert last-modified time from seconds to practical datetime terms
        (my $sec,my $min,my $hour,my $mday,my $mon,my $year,my $wday,my $yday,
        my $isdst) = localtime($mtime);

        ++$mon;
        $year += 1900;

        my $filecdate = sprintf( "m%04i%02i%02i_%02i%02i%02i.$extension", $year, $mon, $mday, $hour, $min, $sec );
        my $full_newfilename = "$dir/$filecdate";

        # to scale files, use imagemagick by using the command below instead of mv 
        #my $cmd = "convert $full_filename -resize $scale% $full_newfilename";
        my $cmd = "mv $full_filename $full_newfilename";
        system( $cmd );

        # update percentage done
        my $percent_done = sprintf( "%5.2lf", 100* (++$curfile) / $number_of_files );
        print "\r$percent_done%";
    }
}
print "\n";

0

আপনি (সংস্করণ 1.600) এর সাহায্যে -X/--keep-extensionবিকল্পটি ব্যবহার করতে পারেন rename:

-X, --keep-extension Save and remove the last extension from a filename, if there is any. The saved extension will be appended back to the filename at the end of the rest of the operations.

rename হোমব্রু থেকে ম্যাক এবং লিনাক্সব্রিউ থেকে লিনাক্সের জন্য উপলব্ধ (অবশ্যই অন্যান্য ইনস্টল অপশনগুলির মধ্যে)।

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