আমি কীভাবে ফোল্ডারের টাইমস্ট্যাম্পগুলি পুনরায় নতুনভাবে ফাইলে পরিবর্তন করতে পারি?


15

আমি ভাবছিলাম যে কেউ কীভাবে ফোল্ডারের ফাইলগুলির সর্বাধিক টাইমস্ট্যাম্পের ভিত্তিতে পুনরাবৃত্তভাবে ফোল্ডারগুলির টাইমস্ট্যাম্পগুলি পরিবর্তন করতে জানেন।

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

জোন @ উবুন্টু প্যান্থার: / মিডিয়া / মিডিয়া / এমপি 3 এস / ফু ফাইটার্স / (1997-05-20) রঙ এবং দ্য শেপ $ ls -alF
মোট 55220
drwxr-xr-x 2 জন জন 4096 2010-08-30 12:34 ./
drwxr-xr-x 11 জন জন 4096 2010-08-30 12:34 ../
-rw-r - r-- 1 জুন জন 1694044 2010-04-18 00:51 ফু ফাইটার্স - পুতুল.এমপি 3
-rw-r - r-- 1 জুন 3151170 2010-04-18 00:51 ফু ফাইটার্স - যথেষ্ট স্পেস। এমপি 3
-rw-r - r-- 1 জুন জন 5004289 2010-04-18 00:52 ফু ফাইটার্স - এভারলং.এমপি 3
-rw-r - r-- 1 জন জন 5803125 2010-04-18 00:51 ফু ফাইটার্স - ফেব্রুয়ারী স্টারস.এমপি 3
-rw-r - r-- 1 জুন জন 4994903 2010-04-18 00:51 ফু ফাইটার্স - আরে, জনি পার্ক! এমপি 3
-rw-r - r-- 1 জুন জন 4649556 2010-04-18 00:52 ফু ফাইটার্স - বানর রেঞ্চ.এমপি 3
-rw-r - r-- 1 জুন জন 5216923 2010-04-18 00:51 ফু ফাইটার্স - আমার হিরো.এমপি 3
-rw-r - r-- 1 জুন জন 4294291 2010-04-18 00:52 ফু ফাইটার্স - আমার দরিদ্র ব্রেইন.এমপি 3
-আরড-আর - r-- 1 জন জন 6778011 2010-04-18 00:52 ফু ফাইটার্স - নতুন উপায় হোম.এমপি 3
-আরড-আর - r-- 1 জন জন 2956287 2010-04-18 00:51 ফু ফাইটার্স - আপনি দেখুন। এমপি 3
-rw-r - r-- 1 জুন 2730072 2010-04-18 00:51 ফু ফাইটার্স - আর্মস.এমপি 3-এ
-আরড-আর - r-- 1 জন জন 6086821 2010-04-18 00:51 ফু ফাইটার্স - আপনার পরে হাঁটা
-আরড-আর - r-- 1 জন জন 3033660 2010-04-18 00:52 ফু ফাইটার্স - উইন্ড আপ.এমপি 3

"(1997-05-20) ফোল্ডারটির কালার এবং দ্য শেপ" এর টাইমস্ট্যাম্পটি 2010-04-18 00:52 এ সেট হবে।

উত্তর:


20

আপনি touch -rবর্তমান সময়ের (বা touch --reference=FILE) পরিবর্তে অন্য কোনও ফাইলের টাইমস্ট্যাম্প ব্যবহার করতে পারেন

এখানে দুটি সমাধান দেওয়া হল। প্রতিটি সমাধানে, প্রথম কমান্ড ডিরেক্টরিটির পরিবর্তনের সময়টিকে তত্ক্ষণাত্ তার অধীনে থাকা নতুন ফাইলে পরিবর্তিত করে এবং দ্বিতীয় কমান্ডটি পুরো ডিরেক্টরি ট্রিটিকে পুনরাবৃত্তভাবে দেখে। যে cd '.../(1997-05-20) The Colour and The Shape'কোনও কমান্ড চালানোর আগে ডিরেক্টরিতে ( ) পরিবর্তন করুন ।

Zsh এ ( Dডট ফাইলগুলি উপেক্ষা করার জন্য অপসারণ করুন ):

touch -r *(Dom[1]) .
touch -r **/*(Dom[1]) .

লিনাক্সে (বা আরও সাধারণভাবে জিএনইউ অনুসন্ধান সহ):

touch -r "$(find -mindepth 1 -maxdepth 1 -printf '%T+=%p\n' |
            sort |tail -n 1 | cut -d= -f2-)" .
touch -r "$(find -mindepth 1 -printf '%T+=%p\n' |
            sort |tail -n 1 | cut -d= -f2-)" .

তবে মনে রাখবেন যে সেগুলি ফাইলের নামে কোনও নতুন লাইন অক্ষর ধরে না।


কমান্ডগুলি কাজ করে (আমি লিনাক্সগুলি ব্যবহার করি) তবে এটি পুনরাবৃত্তভাবে কাজ করছে না। আমি এটিকে আমার মূল ফোল্ডারে (/ মিডিয়া / মিডিয়া / এমপি 3) চালিয়েছি এবং সেখানে থাকা শিল্পী ডিরেক্টরিগুলির সাথে এর ভাগ্য নেই। এখন পর্যন্ত আপনার সহায়তার জন্য আপনাকে ধন্যবাদ।
MonkeyWunch32

@ MonkeyWunch32: আমি আপনার প্রশ্নের উত্তরটি বুঝতে পেরেছি। আপনি কি নীচের প্রতিটি ডিরেক্টরিতে আদেশটি প্রয়োগ করতে চান /media/media/MP3s? Zsh মধ্যে এর ফলে: for d in /media/media/MP3s/**/*(/); do touch -r $d/*(Dom[1]) $d; done। Zsh ব্যতীত (তবে সত্যিই zsh ব্যবহার করুন, এটি কেবল সহজ): কমান্ডটি একটি স্ক্রিপ্টে রেখে রান করুন find /media/media/MP3s -type d -execdir /path/to/the/script \;
গিলস'স'-এ দুষ্ট হওয়া বন্ধ করুন '

পরিপূর্ণতা! আপনি একটি zsh মাস্টার! : ডি
MonkeyWunch32

আপনি যদি ব্যবহার করেন তবে for d in ...কীভাবে আপনি নিম্নলিখিতগুলি মানিয়ে নিতে পারেন, সুতরাং এটি ফোল্ডারগুলির সাথেও কাজ করবে, এতে স্পেস রয়েছে? (এটি এখনও আমার সমাধানে নিখোঁজ রয়েছে)
রুব 77 ই

@ রুবো 77 আপনি কী বলছেন তা আমি বুঝতে পারি না। আমি পোস্ট করা সমস্ত সমাধানগুলি ফাঁকা ফাইলগুলির নামের উপর কাজ করে (তাদের মধ্যে কিছুগুলি নিউলাইনযুক্ত ফাইলের নামে ব্যর্থ হয়)। নোট করুন যে আমার কয়েকটি সমাধানের জন্য zsh প্রয়োজন, যা ভেরিয়েবল বিকল্পের চারপাশে ডাবল উদ্ধৃতি প্রয়োজন হয় না।
গিলস 'অশুভ হওয়া বন্ধ করুন'

3

এটি "পুনরাবৃত্তভাবে" নয়, এটি কেবল একটি ফোল্ডারে সমস্ত টাইমস্ট্যাম্পগুলি পরিবর্তন করে। যদি আপনি যা বোঝাতে চান এটির দুটি পদক্ষেপ আছে।

stat -c '%Y' filenameআউটপুট টাইমস্ট্যাম্প হবে filename, এবং stat -c '%Y %n' *ইচ্ছা আউটপুট টাইমস্ট্যাম্প এবং ফোল্ডার প্রতিটি ফাইলের ফাইলের নাম, তাই এই বর্তমান ফোল্ডারে অতি সাম্প্রতিক সংশোধিত ফাইলের ফাইলের নাম পাবেন:

mostrecent="`stat -c '%Y %n' * | sort -n | tail -n1 | cut -d ' ' -f '2-'`"

দ্বিতীয় চিন্তার উপর, একটি এর পথ ফোল্ডারে সর্বোচ্চ টাইমস্ট্যাম্প পেতে করার সহজ উপায়:

mostrecent="`ls -t | head -n1`"

তারপরে আপনি ফোল্ডারের সমস্ত ফাইলকে সেই ফাইলের মতো টাইমস্ট্যাম্পে পরিবর্তন করতে চান। touch -r foo barপরিবর্তন করতে হবে barহিসাবে একই পরিবর্তিত টাইমস্ট্যাম্প আছে fooতাই এটি আপনার অতি সাম্প্রতিক সংশোধিত ফাইল হিসাবে একই পরিবর্তিত টাইমস্ট্যাম্প আছে ফোল্ডারের সমস্ত ফাইলগুলি পরিবর্তন করতে হবে:

touch -r "$mostrecent" *

সুতরাং, ওয়ান-লাইনারটি হ'ল:

touch -r "`ls -t | head -n1`" *

Ls এর আউটপুট পার্স করা একটি খারাপ ধারণা , যদিও আমি স্বীকার করি এটি একটি লোভনীয় ঘটনা। এটি এখনও ঝুঁকিপূর্ণ যদি lsমঙ্গলগুলি অ-এসসিআইআই অক্ষরযুক্ত নামগুলি ফাইল করে। যদি আপনি ওয়ান-লাইনার চান, zsh :-) ব্যবহার করুন
গিলস'স-অশুভ হওয়া বন্ধ করুন '

@ গিলস এটিই তবে আমি এটি করতে সমস্যা হতে চলেছি; আমি মনে করি কারণ আমার ফাইলের নামগুলিতে অ-এসসিআইআই অক্ষর নেই। যদিও আপনার উত্তরটি আরও ভাল
মাইকেল মরোজেক

2

আমি কাজটি এখন এক সাথে রেখেছি:

এটি এমন একটি স্ক্রিপ্ট হবে যা /tmp/test/প্রতিটি ডিরেক্টরিতে নতুন ডিরেক্টরিগুলির টাইমস্ট্যাম্পের ভিতরে সমস্ত ডিরেক্টরিকে পরিবর্তন করে :

#!/bin/bash
if [ -z "$1" ] ; then
  echo 'ERROR: Parameter missing. specify the folder!'
  exit
fi
#MODE=tail # change to newest file
MODE=head # change to oldest file
for d in "$1"/*/; do
  echo "running on $d"
  find "$d" -type d -execdir \
    echo touch --reference="$(find "$d" -mindepth 1 -maxdepth 1 -printf '%T+=%p\n' \
                              | sort | "$MODE" -n 1 | cut -d= -f2-)" "$d" \;
    # remove echo to really run it
done

আপনি / টেম্পে এই জাতীয় কিছু টেস্টিং ফাইল যুক্ত করতে পারেন:

mkdir /tmp/test
cd /tmp/test
mkdir d1
mkdir d2
touch d1/text1.txt
sleep 1
touch d1/movie1.mov
touch d2/movie2.mov
sleep 1
touch d2/text2.txt
touch notthis.file


1
আপনার সম্পাদনার জন্য ধন্যবাদ, এটি কার্যকর! যদিও প্রতিধ্বনি "আবার মুছে ফেলেছে , এটি প্রথম দেখায় যেমন এটি অনুপস্থিত তবে এটি কার্যকর হয়।
রুবো 77


0

আমি এই স্ক্রিপ্টটি সর্বশেষতম সামগ্রীতে পুনরাবৃত্তভাবে ফোল্ডার টাইমস্ট্যাম্প সেট করতে ব্যবহার করি। (এটি গিলসের জবাবের সাথে খুব মিল):

#! /bin/bash

# Change mtime of directories to that of latest file (or dir) under it, recursively
# Empty leaf directories, or dirs with only symlinks get the $default_timestamp

default_timestamp='1980-01-01 00:00:00'

dir="$1"

[ -d "$dir" ] || { echo "Usage: $0 directory" >&2; exit 1; }

find "$dir" -depth -type d | while read d; do
    latest=$(find "$d" -mindepth 1 -maxdepth 1 \( -type f -o -type d \) -printf '%T@ %p\n' | sort -n | tail -1 | cut -d' ' -f2-)
    if [ -n "$latest" ]; then
        touch -c -m -r "$latest" "$d" \
            || echo "ERROR setting mtime of '$d' using ref='$f'" >&2
    else
        touch -c -m -d "$default_timestamp" "$d" \
            || echo "ERROR setting mtime of '$d' to default '$default_timestamp'" >&2
    fi
done

0

আমি @ গিলস জেডএস কমান্ড নিয়েছি এবং সাবফোল্ডারগুলিতে কাজ করার জন্য এটি বাড়িয়েছি, তবে মনে হচ্ছে zsh ** / * (এফডিড) অংশের জন্য মারাত্মকভাবে অক্ষম।

# Don't do this
for d in **/*(FDod); do touch -r "$d"/*(Dom[1]) "$d"; done

উদ্ধৃতিগুলি ফাঁকা স্থান এবং ট্যাবযুক্ত ডিরেক্টরি এন্ট্রিগুলিকে সঠিকভাবে কাজ করার অনুমতি দেয়। এফডি এটিকে খালি নয় এমন ডিরেক্টরিগুলি সন্ধান করে যা প্রারম্ভিক শুরুগুলি সহ,, অদ্ভুতভাবে গভীরতা-প্রথম পদ্ধতিতে এটি অনুসন্ধান করে, যাতে প্যারেন্ট ফোল্ডারের টাইমস্ট্যাম্পগুলি সঠিকভাবে আপডেট হয়।

পরীক্ষার সময়, আমি লক্ষ্য করেছি যে ** / * (এফডিড) এর জন্য পারফরম্যান্স এবং মেমরির পদক্ষেপটি উন্মাদ ছিল (মাত্র 650k ফোল্ডারের জন্য 1.4 গিগাবাইটের বেশি) এবং এটি ফোল্ডারগুলি স্পর্শ করা শুরু করার আগে পুরোটা পড়েছিল। এটি অনুসন্ধান / পড়ার সাথে প্রতিস্থাপনের পরে এটি আরও দ্রুত হয়ে ওঠে, মেমরিটি পোড়ায় না এবং প্রায় সোজা শুরু হয়।

#! /usr/bin/env zsh
# Do this instead
find "$@" -depth -type d ! -empty -print0 |while IFS= read -r -d ''; do
    touch -r "$REPLY"/*(Dom[1]) "$REPLY"
done

আপনি যদি এটি কোনও স্ক্রিপ্টে চালাচ্ছেন না, আপনি যে ফোল্ডারগুলি থেকে চালাতে চান তার সাথে "$ @" প্রতিস্থাপন করুন।


-1

শেল কমান্ডগুলির অস্পষ্টতা আমি সত্যিই পছন্দ করি না এবং তা অজগরে তাড়াতাড়ি করেছিলাম।

এটি পুনরাবৃত্তভাবে সমস্ত ডিরেক্টরি মাইটাইমসকে সর্বাধিক সর্বাধিক বাদ দেওয়া ফাইল / ডির এমটাইমের ভিতরে সেট করে।

import os
import sys

EXCLUDE_FILES = ['.DS_Store']
EXCLUDE_DIRS = ['.git', '.hg']

def inheritMTime(path):
    for root, dirs, files in os.walk(path, topdown=False, followlinks=False):
        currentMaxMtime = None
        for subpath in files:
            if subpath in EXCLUDE_FILES:
                print "ignore file", os.path.join(root, subpath)
                continue
            currentMaxMtime = max(currentMaxMtime, os.lstat(os.path.join(root, subpath)).st_mtime)
        for subpath in dirs:
            if subpath in EXCLUDE_DIRS:
                print "ignore dir", os.path.join(root, subpath)
                continue
            currentMaxMtime = max(currentMaxMtime, os.lstat(os.path.join(root, subpath)).st_mtime)
        if currentMaxMtime is not None:
            os.utime(root, (currentMaxMtime, currentMaxMtime))

if __name__ == "__main__":
    for dir in os.listdir(sys.argv[1]):
        if os.path.isdir(dir):
            current = os.path.join(sys.argv[1], dir)
            inheritMTime(current)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.