วันที่สั่งซื้อจะเรียงลำดับตามอะไร ลำดับตัวอักษรและตัวเลขไม่แน่นอน
ls -lt
เรียงลำดับตามเวลาที่แก้ไข แต่ฉันต้องการเวลาในการสร้าง
วันที่สั่งซื้อจะเรียงลำดับตามอะไร ลำดับตัวอักษรและตัวเลขไม่แน่นอน
ls -lt
เรียงลำดับตามเวลาที่แก้ไข แต่ฉันต้องการเวลาในการสร้าง
คำตอบ:
Unices ส่วนใหญ่ไม่มีแนวคิดเรื่องเวลาในการสร้างไฟล์ คุณไม่สามารถls
พิมพ์ได้เนื่องจากไม่มีการบันทึกข้อมูล หากคุณต้องการเวลาในการสร้างใช้ระบบควบคุมเวอร์ชัน : กำหนดเวลาการสร้างเป็นเวลาเช็คอิน
หากตัวแปร unix ของคุณมีเวลาสร้างให้ดูที่เอกสารของมัน ตัวอย่างเช่นในMac OS X (ตัวอย่างเดียวที่ฉันรู้of¹) ls -tU
การใช้งาน Windows ยังเก็บเวลาในการสร้าง แต่ก็ไม่ได้เปิดรับพอร์ตยูทิลิตี้ของยูนิกซ์เสมอไปตัวอย่างเช่น Cygwin ls
ไม่มีตัวเลือกในการแสดง stat
ยูทิลิตี้สามารถแสดงเวลาการสร้างเรียกว่า“เวลาเกิด” ได้ในสาธารณูปโภค GNU ดังนั้นภายใต้ Cygwin stat -c '%W %n' * | sort -k1n
คุณสามารถแสดงไฟล์เรียงตามเวลาที่เกิดกับ
โปรดทราบว่าctime ( ls -lc
) ไม่ใช่เวลาสร้างไฟล์มันเป็นเวลาเปลี่ยนinode เวลาเปลี่ยนแปลง inode นั้นจะได้รับการอัพเดตทุกครั้งที่มีอะไรเกี่ยวกับการเปลี่ยนแปลงของไฟล์ (เนื้อหาหรือข้อมูลเมตา) ยกเว้นว่าเวลาจะไม่ได้รับการอัพเดตเมื่ออ่านไฟล์เพียงอย่างเดียว โดยเฉพาะอย่างยิ่ง ctime มักจะล่าสุดกว่า mtime (เวลาแก้ไขเนื้อหาไฟล์) เว้นแต่ว่า mtime จะถูกตั้งค่าเป็นวันที่ในอนาคตอย่างชัดเจน
-U
เรียงลำดับตามเวลาที่สร้าง ภายใต้ระบบปฏิบัติการ Solaris 10.x: /usr/bin/ls
ไม่สนับสนุน-U
, /usr/ucb/ls
การสนับสนุน-U
และไม่เรียงลำดับตามเวลาที่สร้าง ผลลัพธ์เหล่านี้ขึ้นอยู่กับระบบไฟล์ที่จัดเก็บข้อมูลนั้นตั้งแต่แรก
น่าเสียดายที่stat(2)
API ไม่ได้มีวิธีในการรับเวลาในการสร้างไฟล์เนื่องจากไม่จำเป็นต้องใช้ตามมาตรฐาน Unix
อย่างไรก็ตามระบบไฟล์บางระบบext4
จะบันทึกข้อมูลนี้ไว้ในเมทาดาทาของไฟล์ ไม่มีวิธีมาตรฐานในการรับ แต่มีวิธี ( ext
ระบบไฟล์เท่านั้น):
debugfs -R 'stat partition/relative/path/to/file' /dev/sda1
คุณจะได้รับสิ่งที่ต้องการการกล่าวขวัญว่าcrtime
( ไม่ ctime
) ext4
ถ้าคุณใช้
ctime: 0x513a50e5:d4e448f0 -- Fri Mar 8 21:58:13 2013
atime: 0x513dd8f1:04df0b20 -- Mon Mar 11 14:15:29 2013
mtime: 0x513a50e5:d4e448f0 -- Fri Mar 8 21:58:13 2013
crtime: 0x513a259a:35191a3c -- Fri Mar 8 18:53:30 2013
คำสั่งนี้อาจใช้เวลาสักครู่เพื่อส่งคืนอาจเป็นเพราะมันยังแสดงรายการทุกส่วนที่เกี่ยวข้องกับไฟล์
ตอนนี้ถ้าคุณต้องการสั่งซื้อไฟล์ตามวันที่สร้างฉันคิดว่ามันเป็นไปไม่ได้อย่างง่ายดาย อย่างที่กิลส์บอกว่าอาจจะง่ายกว่าถ้าคุณใช้ระบบควบคุมการแก้ไข แต่คุณอาจลองดูที่ext4
API ...
ฉันลองใช้stat -c '%w' myfile
คำสั่งบนext4
filesytem บนระบบ Ubuntu (ไม่นานมานี้) โดยไม่ประสบความสำเร็จ (เป็นเพียงคำตอบ-
)
f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
นี่คือสคริปต์ Perl ที่ใช้คำตอบของ Totor เพื่อให้ได้สิ่งที่คุณต้องการ (ถ้าระบบไฟล์ของคุณมี ext4)
ทำงานบนเครื่องที่บ้านของฉัน (Ubuntu) และเซิร์ฟเวอร์ของฉัน (CentOS) แต่ไม่ได้ทดสอบมากกว่านั้นดังนั้น ymmv
#!/usr/bin/env perl
use Modern::Perl '2009';
use DateTime;
# Open the current directory for reading
opendir my $dh, "." or die "Unable to open directory: $!";
# Create a hash to save results into
my %results;
my %datestamp;
# Loop through the directory getting creation date stats for each file
while ( my $filename = readdir $dh ) {
# Skip non-files
next if $filename eq '.' or $filename eq '..';
# Save the ls output for this file/directory
$results{ $filename } = `ls -ld $filename`;
my $stats = `debugfs -R 'stat $filename' /dev/sda6 2>/dev/null`;
# crtime: 0x51cd731c:926999ec -- Fri Jun 28 12:27:24 2013
$stats =~ m/crtime\: \w+\:\w+ -- (.+?)\n/s;
my $datestring = $1;
# Dissect date with a regexp, ick
my %months = (
'Jan' => '1',
'Feb' => '2',
'Mar' => '3',
'Apr' => '4',
'May' => '5',
'Jun' => '6',
'Jul' => '7',
'Aug' => '8',
'Sep' => '9',
'Oct' => '10',
'Nov' => '11',
'Dec' => '12',
);
$datestring =~ m/\w+ (\w+) ?(\d+) (\d\d)\:(\d\d)\:(\d\d) (\d\d\d\d)/;
# Convert date into a more useful format
my $dt = DateTime->new(
year => $6,
month => $months{$1},
day => $2,
hour => $3,
minute => $4,
second => $5,
);
# Save the datestamp for this result
$datestamp{ $filename } = $dt->iso8601;
}
# Output in date order
my @filenames = sort { $datestamp{$a} gt $datestamp{$b} } keys %datestamp;
foreach my $filename ( @filenames ) {
print $results{ $filename };
}