我需要將舊的二進制日誌移動到一個目錄並在將其移動到新資料夾之前對其進行壓縮。
由於空間緊張,我們面臨一些問題。
下面的命令不起作用。
ls -t binlog* | tail -n +4 | xargs mv /path-to-directory
ls -t binlog* | tail -n +4 | xargs echo mv /path-to-directory
答案1
如果您確實不想訴諸 logrotate,請使用find
not 解析 的輸出ls
,同時列印自 1970.01.01 以來最後找到的文件的修改時間(以秒為單位)。
$ find ./* -maxdepth 0 -name "binlog*" -printf "%T@ %f\0" \
| sort -z -k 1 -r \
| cut -z -d " " -f2- \
| tail -z -n +4 \
| xargs -0 -I {} mv -f "{}" /path/to/directory/
上面假設 GNU coreutils,它接受-z
( sort
、cut
和tail
) 或-0
( xargs
) 使用 NUL 分隔行,這意味著即使檔案名稱中包含換行符,程式碼也能正常運作。
如果您可以確定文件名稱中沒有換行符,則事實證明您不需要使用 null ( \0
) 終止每個找到的文件,因為您正在第一個欄位(文件的上次修改時間)上按行排序)其中從不包含有問題的字元。您可以將上面的內容簡化為:
$ find ./* -maxdepth 0 -name "binlog*" -printf "%T@ %f\n" \
| sort -k 1 -r \
| cut -d " " -f2- \
| tail -n +4 \
| xargs -I {} mv -f "{}" /path/to/directory/