ফাইলের শেষে ফাইলের একগুচ্ছ তারিখ সংশোধিত টাইমস্ট্যাম্পের সাথে নামকরণ?


14

সুতরাং, বলুন, আমার কাছে g.txt এর মতো গুচ্ছ ফাইলের একটি ডিরেক্টরি রয়েছে, যেখানে g.txt সর্বশেষে 20 জুন, 2012-এ সংশোধন করা হয়েছিল।

২০ শে জুন, ২০১২ শেষ সংশোধিত তারিখের শেষে আমি কীভাবে সমস্ত ফাইল (g.txt) এর নাম পরিবর্তন করব?

উত্তর:


13

দ্রুত-এবং-মলিন ব্যাশ এক-লাইনের থেকে বর্তমান ডিরেক্টরির মধ্যে সমস্ত (globbed) ফাইল নামান্তর করতে filename.txtকরতে filename.txt-20120620:

for f in *; do mv -- "$f" "$f-$(stat -c %Y "$f" | date +%Y%m%d)"; done

একটি উদ্যোগী বাশ নার্দ এটি ভাঙ্গার জন্য কিছু প্রান্তের কেস খুঁজে পাবে, আমি নিশ্চিত। :)

স্পষ্টতই, এটি কোনও ফাইলে ইতিমধ্যে শেষের তারিখের মতো দেখতে এমন কিছু আছে কিনা তা যাচাই করার মতো পছন্দসই কাজ করে না।


2
+1, দেখতে ভাল লাগছে। আপনি এমভিতে প্রথম আর্গ হিসাবে '-' ব্যবহার করে একে আরও শক্তিশালী করতে পারেন। সঙ্গে begining filenaes বিরুদ্ধে রক্ষীদের '-'
সি এ এস

5
এটি কোন ধরণের dateবাস্তবায়ন? আমার জিএনইউ dateইনপুট পরিচালনা করছে বলে মনে হচ্ছে না।
manatwork


2
@jgoldschrafe, আপনি কি নিশ্চিত যে কোডটি আপনার পক্ষে সঠিকভাবে কাজ করে? পেস্টবিন.
com

5
ভাল ধরা manatwork। আমার জিএনইউ তারিখ 8.13 স্ট্যান্ডিন থেকে পড়া সমর্থন করে না। এটি "-r" দিয়ে একটি ফাইলের মোড টাইম ব্যবহার করে সমর্থন করে - উদাহরণস্বরূপ "তারিখ +% Y% m% d -r $ f", সুতরাং এই নির্দিষ্ট ক্ষেত্রে স্ট্যাট এমনকি প্রয়োজন হয় না।
ক্যাস

18

এখানে সোনারশ্রাফির ওয়ান-লাইনারের একটি সংস্করণ এখানে রয়েছে:

  • স্ট্যাট ব্যবহার করে না
  • GNU তারিখের পূর্ববর্তী সংস্করণগুলির সাথে কাজ করে
  • ফাইলের নামগুলিতে কোনও স্পেস সহ সঠিকভাবে কপি করে
  • ড্যাশ দিয়ে শুরু হওয়া ফাইলের নামগুলিও অনুলিপি করে

    for f in *; do mv -- "$f" "$f-$(date -r "$f" +%Y%m%d)"; done


1
আপনার এটি করা উচিত date -r "$f" +%Y%m%dবা POSIXLY_CORRECTপরিবেশে থাকলে এটি কাজ করবে না । সাধারণত, অন্যান্য যুক্তিগুলির আগে বিকল্পগুলি হওয়া উচিত।
স্টাফেন চেজেলাস

এটি "সঠিক উত্তর" হওয়া উচিত
9-10 এ অবৈধ ব্যবহারকারী নাম

অবশ্যই আপনার মধ্যে ধনুর্বন্ধনী প্রয়োজন নেই "${f}"
জি-ম্যান

তবে আপনি কীভাবে এমনটি তৈরি করবেন যে আমরা যে তারিখগুলি প্রেরণ করেছি যেমন "Ymd-filename"?
টাইমব্যান্ড

2

বাধ্যতামূলক zsh ওয়ান-লাইনার (componentsচ্ছিক উপাদানগুলির এক-সময়ের লোড গণনা করা নয়):

zmodload zsh/stat
autoload -U zmv
zmv -n '(*)' '$1-$(stat -F %Y%m%d +mtime -- $1)'

আমরা মডিউলstat থেকে বিল্টিন এবং ফাইলগুলির নাম পরিবর্তন করতে ব্যবহার করি। এবং এখানে একটি অতিরিক্ত যা এক্সটেনশনের আগে তারিখটি রাখে, যদি থাকে।zsh/statzmv

zmv -n '(*)' '$1:r-$(stat -F %Y%m%d +mtime -- $1)${${1:e}:+.$1:e}'

1

আমি যেমন বুঝতে পেরেছি আমরা আগেই জানিনা যে পরিবর্তনের তারিখটি কী। সুতরাং আমাদের এটি প্রতিটি ফাইল থেকে নেওয়া, আউটপুট ফর্ম্যাট করা এবং প্রতিটি ফাইলের এমনভাবে নামকরণ করা দরকার যাতে এটি ফাইলের নামগুলিতে পরিবর্তনের তারিখ অন্তর্ভুক্ত করে।

আপনি এই স্ক্রিপ্টটিকে "modif_date.sh" এর মতো কিছু হিসাবে সংরক্ষণ করতে এবং এটি সম্পাদনযোগ্য করে তুলতে পারেন। আমরা এটি আর্গুমেন্ট হিসাবে লক্ষ্য ডিরেক্টরিতে অনুরোধ করি:

modif_date.sh txt_collection

"Txt_colલેક્શન" হ'ল ডিরেক্টরিটির নাম যেখানে আমাদের কাছে থাকা সমস্ত ফাইল রয়েছে যা আমরা নাম পরিবর্তন করতে চাই।

#!/bin/sh

# Override any locale setting to get known month names
export LC_ALL=c
# First we check for the argument
if [ -z "$1" ]; then
    echo "Usage: $0 directory"
    exit 1
fi

# Here we check if the argument is an absolute or relative path. It works both ways
case "${1}" in
  /*) work_dir=${1};;
  *) work_dir=${PWD}/${1};;
esac

# We need a for loop to treat file by file inside our target directory
for i in *; do
    # If the modification date is in the same year, "ls -l" shows us the timestamp.
    # So in this case we use our current year. 
    test_year=`ls -Ggl "${work_dir}/${i}" | awk '{ print $6 }'`
    case ${test_year} in *:*) 
        modif_year=`date '+%Y'`
        ;;
    *)
        modif_year=${test_year}
        ;;
    esac
    # The month output from "ls -l" is in short names. We convert it to numbers.
    name_month=`ls -Ggl "${work_dir}/${i}" | awk '{ print $4 }'`
    case ${name_month} in
            Jan) num_month=01 ;;
            Feb) num_month=02 ;;
        Mar) num_month=03 ;;
        Apr) num_month=04 ;;
        May) num_month=05 ;;
        Jun) num_month=06 ;;
        Jul) num_month=07 ;;
        Aug) num_month=08 ;;
        Sep) num_month=09 ;;
        Oct) num_month=10 ;;
        Nov) num_month=11 ;;
        Dec) num_month=12 ;;
        *) echo "ERROR!"; exit 1 ;;
    esac
    # Here is the date we will use for each file
    modif_date=`ls -Ggl "${work_dir}/${i}" | awk '{ print $5 }'`${num_month}${modif_year}
    # And finally, here we actually rename each file to include
    # the last modification date as part of the filename.
    mv "${work_dir}/${i}" "${work_dir}/${i}-${modif_date}"
done

1
আপনি কীভাবে আপনার স্ক্রিপ্টটি প্রায় 3/4 দিয়ে সঙ্কুচিত করতে পারেন তা নির্ধারণের জন্য স্ট্যাট (1) এর জন্য ম্যান পৃষ্ঠাটি পড়ুন ... উপরের বেশিরভাগটি হুইলটি পুনরায় উদ্ভাবন করছে। বিশেষত, 'স্ট্যাটাস-সি% ওয়াই' আপনাকে পর্বের সময় থেকে সেকেন্ডে একটি ফাইলের সংশোধন সময় দেবে (1970-01-01 00:00:00)। এটি প্রয়োজন অনুসারে টাইমস্ট্যাম্পটি ফর্ম্যাট করতে আজকের ইনপুট হিসাবে (1) হিসাবে ব্যবহার করা যেতে পারে। উদাহরণ হিসাবে jgoldschrafe এর উত্তর দেখুন।
ক্যাস

@ ক্রেইগস্যান্ডার্স বিপরীতটি হ'ল এই স্ক্রিপ্টটি লিনাক্স ব্যতীত অন্য অপারেটিং সিস্টেমের অধীনে কাজ করে, যার আলাদা আলাদা statইউটিলিটি রয়েছে বা কিছুই নেই none
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

নোট করুন যে আউটপুট পার্সিং lsনির্ভরযোগ্য নয় । কিছু ইউনিক্স ভেরিয়েন্টে ব্যবহারকারী এবং গোষ্ঠীর নামগুলিতে স্পেস থাকতে পারে যা তারিখের কলামগুলির প্রান্তিককরণ বন্ধ করে দেবে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ গাইলস: সত্য, তবে যে কোনও বুদ্ধিমান :-) কোনও নন-লিনাক্স সিস্টেমে জিএনইউ কোর্টিলগুলি (এবং অন্যান্য সমস্ত জিএনইউ সরঞ্জাম) ইনস্টল করতে পারে। ইউজারল্যান্ড সরঞ্জামগুলির কেবলমাত্র একটি ভাল সেটই নয়, অন্তর্নিহিত কার্নেল নির্বিশেষে একটি সামঞ্জস্যপূর্ণ সেট পাওয়ার এটি সহজতম উপায়।
ক্যাস

1
(চালিয়ে যাওয়া) ... (৫) আরেকটি ত্রুটি: এটি ধরে নিয়েছে যে কোনও তারিখ / সময় তারিখ এবং সময় ls হিসাবে প্রদর্শিত হবে (তারিখ এবং এক বছরের পরিবর্তে) অবশ্যই চলতি বছরে থাকতে হবে। এটি সত্য নয়। এটি গত ছয় মাসে; এটি পূর্ববর্তী বছরে হতে পারে (উদাহরণস্বরূপ, ২১-সেপ্টেম্বর -2016 এর মাধ্যমে 31-ডিসেম্বর -2016 গত ছয় মাসের মধ্যে রয়েছে)। ()) গ্রেগের উইকি (যা @ গিলস ইতিমধ্যে উদ্ধৃত করা হয়েছে) পোকার তোরণের ঝুঁকিতে, নতুন নাম (গুলি) এবং স্পেস যুক্ত ফাইলের নামগুলি এটি ব্যর্থ হতে পারে। … (চালিয়ে যাওয়া)
জি-ম্যান

0

এখানে CA গুলির এর oneliner সংস্করণ, (goldschrafe এর oneliner উপর ভিত্তি করে) সঙ্গে বাড়ানো idempotence ,

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

ব্যবহারের ক্ষেত্রে: সহায়ক যদি আপনি ডিরেক্টরিতে নতুন ফাইল যুক্ত করেন এবং যারা এখনও নেই তাদের সাথে তারিখের সময়ের উপসর্গ যুক্ত করতে চান helpful

for f in * ; do
  if [[ "$f" != ????-??-??' '??:??:??' - '* ]]; then
    mv -v -- "$f" "$(date -r "$f" +%Y-%m-%d' '%H:%M:%S) - $f" ;
  fi;
done

আপনার ফাইল টাইমস্ট্যাম্প মাতাল এবং JPEGs হয় হয়, আপনি ফার তাদের এক্জিফ তথ্য দিয়ে ঠিক করতে পারেন: for f in *.jpg ; do jhead -ft "$f" ; done: উৎস unix.stackexchange.com/a/290755/9689
Grzegorz Wierzowiecki
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.