Я хочу переместить файлы в каталог, которые не используются в настоящее время. У меня есть смысл что некоторая комбинация lsof
, find
, и xargs
мог работать, но я не могу вполне добраться там. До сих пор я создал следующую команду:
lsof mydir/*|awk '(NR>1){print $9}
Это дает мне список файлов, которые используются. Если я мог бы просто получить список файлов, которые не используются, то что-то как xargs могло проблема a mv
на тех файлах. Я просто, может казаться, не нахожу изящный способ сделать это. У кого-либо есть какие-либо подсказки для меня?
Благодаря предложению @Sorpigal я нашел простой способ сделать эту работу без циклов:
comm -2 -3 <(find $dir -maxdepth 1 -type f|sort) <(sudo lsof $dir/* | awk '(NR>1) {print $9}'|sort) | xargs -I {} mv {} $move_dir
Я не уверен в условиях состязания, но это не имеет значения в моем случае. Файлы открыты однажды для записи и затем должны быть закрыты, пока не перемещено.
Я сделал бы это этот путь.
find $dir -maxdepth 1 | sort > $other_dir/all_files
lsof $dir/* | awk '(NR>1) {print $9}' | sort > $other_dir/in_use_files
comm -2 -3 $other_dir/all_files $other_dir/in_use_files
От коммуникации (1):
NAME
comm - compare two sorted files line by line
SYNOPSIS
comm [OPTION]... FILE1 FILE2
...
-2 suppress lines unique to FILE2
-3 suppress lines that appear in both files
Теперь это - простой вопрос переформатирования в серию mv
операторы. Возможно, как это:
while IFS= read file ; do
mv "$file" "$destination/"
done < <(comm -2 -3 all_files in_use_files)
Или использование другого промежуточного файла, если Вы предпочитаете.
Возможно, не лучший способ, но можно просто кодировать его через несколько минут:
уже получите свой список открытых файлов (вид если не)
уже получите список всех файлов (вид если не)
разность два списка
xargs вообще
Количество шагов здесь будет делать ясным что-то, что должно было быть беспокойством так или иначе, которое является условиями состязания - файлы, которые используются, когда Вы выбираете их, могут не быть файлы, которые используются, когда Вы на самом деле перемещаете их.