Karena Unix dan Linux tidak memiliki satu situs web besar tentang alat-alatnya, jadi saya hanya pergi ke situs web seperti about.comdan beberapa situs web lain untuk daftar opsi yang tersedia yang dapat saya gunakan .. tetapi tidak menemukan yang sepertitail
gaijin
Jawaban:
37
for file in $(ls -p | grep -v / | tail -100)
do
mv $file /other/location
done
Yang mengasumsikan nama file tidak mengandung kosong, baris baru (dengan asumsi nilai default $IFS), karakter wildcard ( ?, *, [) atau mulai dengan -.
Perhatikan bahwa pendekatan ini hanya berfungsi jika tidak ada karakter khusus (spasi, karakter tidak dapat dicetak, ``) dalam nama file. Sebagai aturan umum, jangan parsing output darils . Dan selalu kutipkan parameter dan pergantian perintah.
Gilles 'SANGAT berhenti menjadi jahat'
1
Bagian mana yang berisi 100 file?
tshepang
3
Perbarui ke komentar saya sebelumnya: Setelah membaca tautan referensi Gilles, jangan parsing output ls , saya telah menemukan bahwa findperintah saya kurang. Arg berada di tempat yang salah, dan saya telah menambahkan akhiran nama file null. Itu agak panjang dari satu baris, tetapi hanya itu yang bisa saya lakukan dalam komentar. Ini cuplikan find . -maxdepth 1 -type f \( ! -iname ".*" \) -print0 | while read -rd $'\0' file ; do mv -- "$file" /other/location/ ; done
singkatnya
@perer Hanya sebagai catatan bahwa read -dopsi ini tidak portabel untuk semua shell, tetapi jika Anda menggunakan bashanyways, Anda -d ''akan mendapatkan efek yang sama -d $'\0'.
jw013
FWIW jika Anda ingin ini berjalan sebagai oneliner, tambahkan di ;mana setiap baris baru sekarang.
patrick
37
Ini paling mudah di zsh:
mv -- *([1,100]) /other/location/
Bergerak ini pertama 100 non-file tersembunyi (dari jenis apa pun, perubahan ([1,100])untuk (.[1,100])untuk regular file saja, atau (^/[1,100])untuk semua jenis tapi direktori ) nama urutan leksikografis. Anda dapat memilih urutan pengurutan berbeda dengan okualifikasi glob , misalnya untuk memindahkan 100 file terlama:
mv -- *(Om[1,100]) /other/location/
Dengan cangkang lain, Anda dapat melakukannya dalam satu lingkaran dengan keluar awal.
i=0
for x in *; do
if [ "$i" = 100 ]; then break; fi
mv -- "$x" /other/location/
i=$((i+1))
done
@ php, itu akan terjadi untuk bekerja zshbahkan jika pada pandangan pertama yang terlihat sangat asing dengan zshsintaks. Gilles telah menunjukkan cara yang lebih sederhana untuk melakukannya zsh. Meski begitu, itu masih lebih dapat diandalkan daripada jawaban yang saat ini diterima.
Stéphane Chazelas
3
Berikut ini bekerja untuk saya. Maaf jika sudah diposting sebelumnya, tetapi saya tidak melihatnya dalam pemindaian cepat.
ls path/to/dir/containing/files/* | head -100 | xargs -I{} cp {} /Path/to/new/dir
mmv adalah utilitas luar biasa yang juga memungkinkan Anda melakukan penggantian nama massal file. (Saya harus sudo apt-get install mmvmenginstalnya di komputer saya.) Contoh penggunaan sederhana: misalkan Anda memiliki direktori file dengan ekstensi .JPG yang ingin Anda ubah menjadi .jpg huruf kecil. Perintah berikut melakukan trik:
mmv \*.JPG \#1.jpg
Garis miring terbalik digunakan untuk menunjukkan wildcard akan datang. * / JPG cocok dengan apa pun dengan ekstensi JPG. Di bagian "ke" dari perintah, # 1 menggunakan teks yang cocok dari wildcard pertama untuk mengubah nama file. Tentu saja, Anda dapat meletakkan jalur yang berbeda sebelum # 1 untuk juga memindahkan file.
Akan lebih bermanfaat jika Anda memberikan bagaimana Anda sebenarnya menggunakan alat yang Anda sarankan untuk mencapai tujuan.
Dason
1
menambahkan contoh penggunaan
Pete
1
#!/bin/bash
c=1; d=1; mkdir -p NEWDIR_${d}
for jpg_file in *.jpg
do
if [ $c -eq 100 ]
then
d=$(( d + 1 )); c=0; mkdir -p NEWDIR_${d}
fi
mv "$jpg_file" NEWDIR_${d}/
c=$(( c + 1 ))
done
Ini tidak benar, Anda memberikan tiga argumen mv, yang terakhir yang (mungkin) bukan direktori. Dan itu tidak benar-benar menjawab pertanyaan - penanya ingin memindahkan sejumlah file, tidak semuanya.
Mat
Perintah diperbarui.
Saumil
0
Saya datang ke sini, tetapi saya perlu menyalin file di bagian (masing-masing 99) dari /DIR1ke /DIR2. Saya akan menempelkan skrip di sini untuk membantu otherz mungkin:
#!/bin/bash
# Thanks to <Jordan_U> @ #ubuntu
# 06 Dec 2014
i=0
copy_unit=98
for file in /DIR1/*; do
cp "$file" /DIR2
if [[ "$i" -ge "$copy_unit" ]]; then
echo "Pausing, press enter to continue"
read
i=0
fi
((i++))
done
Jika Anda ingin aman / menangani nama file dengan spasi, baris baru, tanda kutip, garis miring terbalik, dll. Anda harus menggunakan pemisah yang diakhiri dengan null:
EDIT2: CATATAN: jika Anda tidak memiliki head -z( untuk alasan apa pun ) Anda dapat mengganti yang di atas head -z -n 1000dengan tr '\0\n' '\n\0' | head -n 1000 | tr '\0\n' '\n\0'(atau melihat cara lain )
-maxdepth 1akan menghindari mencari file dalam subdirektori dari $srcdir, jadi satu-satunya yang terdaftar adalah file di dalamnya $srcdir. -print0akan menggunakan \0alih-alih baris baru ( \n) antara setiap file yang terdaftar - ini membantu menangani file yang berisi baris baru dan spasi dengan xargs. head -zakan menghitung \0baris yang diakhiri (bukan baris baru ( \n) dihentikan sebagai baris. -n 100akan mendaftar hanya 100file pertama yang findditemukan.
Jika Anda ingin melihat perintah apa yang xargsakan dijalankan, tambahkan -t(atau --verbose). xargs -0"Item input diakhiri oleh karakter null ( \0) alih-alih oleh spasi, dan tanda kutip dan garis miring terbalik tidak spesial (setiap karakter diartikan secara harfiah)" xargs -rtidak akan berjalanmvjika tidak ada file yang akan dipindahkan (mis. jika findtidak menemukan file). --mengakhiri pemrosesan argumen sebagai opsi untuk program, lebih detail di sini
Output sampel (menjalankan satu mvperintah dan dapat menangani file dengan baris baru di namanya juga):
$ find /tmp/t -maxdepth 1 -type f -print0 | head -z -n 100 | xargs -t -0 -r -- mv -t /tmp -- ; echo "exit codes: ${PIPESTATUS[@]}"
mv -t /tmp -- /tmp/t/file containing quotes"' then spaces /tmp/t/file containing quotes"' /tmp/t/file containing a slash n here\n /tmp/t/file containing a new line here
and continues /tmp/t/s /tmp/t/-x and -L 1. /tmp/t/of replace-str in the initi /tmp/t/-thisfile_starts_with_a_hyphen and has spaces and a -hyphen here /tmp/t/-thisfile_starts_with_a_hyphen and has spaces /tmp/t/-thisfile_starts_with_a_hyphen /tmp/t/another with spaces /tmp/t/one with spaces /tmp/t/c /tmp/t/a
exit codes: 0 0 0
$ ls -1R /tmp/t
/tmp/t:
a
'another with spaces'
b
c
'file containing a new line here'$'\n''and continues'
'file containing a slash n here\n'
'file containing quotes"'\'''
'file containing quotes"'\'' then spaces'
'of replace-str in the initi'
'one with spaces'
s
'some dir'
-thisfile_starts_with_a_hyphen
'-thisfile_starts_with_a_hyphen and has spaces'
'-thisfile_starts_with_a_hyphen and has spaces and a -hyphen here'
'-x and -L 1.'
/tmp/t/b:
'file with spaces'
'/tmp/t/some dir':
'some file'
Untuk find:
-maxdepth levels
Descend at most levels (a non-negative integer) levels of direc‐
tories below the starting-points. -maxdepth 0
means only apply the tests and actions to the starting-points
themselves.
-type c
File is of type c:
b block (buffered) special
c character (unbuffered) special
d directory
p named pipe (FIFO)
f regular file
l symbolic link; this is never true if the -L option or the
-follow option is in effect, unless the symbolic link is
broken. If you want to search for symbolic links when -L
is in effect, use -xtype.
s socket
D door (Solaris)
-P Never follow symbolic links. This is the default behaviour.
When find examines or prints information a file, and the file is
a symbolic link, the information used shall be taken from the
properties of the symbolic link itself.
-L Follow symbolic links. When find examines or prints information
about files, the information used shall be taken from the prop‐
erties of the file to which the link points, not from the link
itself (unless it is a broken symbolic link or find is unable to
examine the file to which the link points). Use of this option
implies -noleaf. If you later use the -P option, -noleaf will
still be in effect. If -L is in effect and find discovers a
symbolic link to a subdirectory during its search, the subdirec‐
tory pointed to by the symbolic link will be searched.
When the -L option is in effect, the -type predicate will always
match against the type of the file that a symbolic link points
to rather than the link itself (unless the symbolic link is bro‐
ken). Actions that can cause symbolic links to become broken
while find is executing (for example -delete) can give rise to
confusing behaviour. Using -L causes the -lname and -ilname
predicates always to return false.
Untuk head:
-n, --lines=[-]NUM
print the first NUM lines instead of the first 10; with the
leading '-', print all but the last NUM lines of each file
-z, --zero-terminated
line delimiter is NUL, not newline
EDIT: Seseorang menyebutkan bahwa mereka tidak memiliki head -z, ini adalah versi yang saya gunakan (di Fedora 25):
$ head --version
head (GNU coreutils) 8.25
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by David MacKenzie and Jim Meyering.
$ rpm -qf /usr/bin/head
coreutils-8.25-17.fc25.x86_64
Untuk xargs:
-0, --null
Input items are terminated by a null character instead of by
whitespace, and the quotes and backslash are not special (every
character is taken literally). Disables the end of file string,
which is treated like any other argument. Useful when input
items might contain white space, quote marks, or backslashes.
The GNU find -print0 option produces input suitable for this
mode.
-r, --no-run-if-empty
If the standard input does not contain any nonblanks, do not run
the command. Normally, the command is run once even if there is
no input. This option is a GNU extension.
-P max-procs, --max-procs=max-procs
Run up to max-procs processes at a time; the default is 1. If
max-procs is 0, xargs will run as many processes as possible at
a time. Use the -n option or the -L option with -P; otherwise
chances are that only one exec will be done. While xargs is
running, you can send its process a SIGUSR1 signal to increase
the number of commands to run simultaneously, or a SIGUSR2 to
decrease the number. You cannot increase it above an implemen‐
tation-defined limit (which is shown with --show-limits). You
cannot decrease it below 1. xargs never terminates its com‐
mands; when asked to decrease, it merely waits for more than one
existing command to terminate before starting another.
Please note that it is up to the called processes to properly
manage parallel access to shared resources. For example, if
more than one of them tries to print to stdout, the ouptut will
be produced in an indeterminate order (and very likely mixed up)
unless the processes collaborate in some way to prevent this.
Using some kind of locking scheme is one way to prevent such
problems. In general, using a locking scheme will help ensure
correct output but reduce performance. If you don't want to
tolerate the performance difference, simply arrange for each
process to produce a separate output file (or otherwise use sep‐
arate resources).
-t, --verbose
Print the command line on the standard error output before exe‐
cuting it.
Untuk cp:
-t, --target-directory=DIRECTORY
copy all SOURCE arguments into DIRECTORY
-v, --verbose
explain what is being done
Saya tahu utas ini cukup lama, tetapi saya menemukan jawabannya lebih rumit dari yang saya kira seharusnya. Ini berfungsi di CentOS, tetapi tampaknya cukup sederhana sehingga mungkin bisa digunakan di distro lain.
Itu tidak berfungsi karena output dari lstidak akan menyertakan somedir/awalan terkemuka , dan tidak akan bekerja untuk nama file dengan karakter kosong atau wildcard atau mulai dengan -.
Stéphane Chazelas
Cukup adil. Saya benar-benar melakukan cp ls | head -n 100../someDir100/ Dari dalam direktori target dan tidak ada nama file yang memenuhi kasus tersebut. Lebih baik beruntung maka bagus!
about.com
dan beberapa situs web lain untuk daftar opsi yang tersedia yang dapat saya gunakan .. tetapi tidak menemukan yang sepertitail
Jawaban:
Yang mengasumsikan nama file tidak mengandung kosong, baris baru (dengan asumsi nilai default
$IFS
), karakter wildcard (?
,*
,[
) atau mulai dengan-
.sumber
ls
. Dan selalu kutipkan parameter dan pergantian perintah.find
perintah saya kurang. Arg berada di tempat yang salah, dan saya telah menambahkan akhiran nama file null. Itu agak panjang dari satu baris, tetapi hanya itu yang bisa saya lakukan dalam komentar. Ini cuplikanfind . -maxdepth 1 -type f \( ! -iname ".*" \) -print0 | while read -rd $'\0' file ; do mv -- "$file" /other/location/ ; done
read -d
opsi ini tidak portabel untuk semua shell, tetapi jika Anda menggunakanbash
anyways, Anda-d ''
akan mendapatkan efek yang sama-d $'\0'
.;
mana setiap baris baru sekarang.Ini paling mudah di zsh:
Bergerak ini pertama 100 non-file tersembunyi (dari jenis apa pun, perubahan
([1,100])
untuk(.[1,100])
untuk regular file saja, atau(^/[1,100])
untuk semua jenis tapi direktori ) nama urutan leksikografis. Anda dapat memilih urutan pengurutan berbeda dengano
kualifikasi glob , misalnya untuk memindahkan 100 file terlama:Dengan cangkang lain, Anda dapat melakukannya dalam satu lingkaran dengan keluar awal.
Cara portabel lainnya adalah dengan membuat daftar file dan menghapus semua kecuali 100 yang terakhir .
sumber
$(( i++ ))
atau$[ i++ ]
?++
dan--
. Anda bisa menulis: $((i+=1))
alih-alihi=$((i+1))
; Saya tidak yakin itu lebih mudah dibaca.ls -p | grep -v /
pertanyaan terakhir yang menduplikasi di sini.Jika Anda tidak menggunakan zsh:
Akan memindahkan 100 (dalam urutan abjad) terakhir.
sumber
Oneliner berikut di shell akan membantu.
sumber
zsh
bahkan jika pada pandangan pertama yang terlihat sangat asing denganzsh
sintaks. Gilles telah menunjukkan cara yang lebih sederhana untuk melakukannyazsh
. Meski begitu, itu masih lebih dapat diandalkan daripada jawaban yang saat ini diterima.Berikut ini bekerja untuk saya. Maaf jika sudah diposting sebelumnya, tetapi saya tidak melihatnya dalam pemindaian cepat.
sumber
Dari https://stackoverflow.com/questions/14033129/how-to-move-a-given-number-of-random-files-on-unix-linux-os
sumber
mmv adalah utilitas luar biasa yang juga memungkinkan Anda melakukan penggantian nama massal file. (Saya harus
sudo apt-get install mmv
menginstalnya di komputer saya.) Contoh penggunaan sederhana: misalkan Anda memiliki direktori file dengan ekstensi .JPG yang ingin Anda ubah menjadi .jpg huruf kecil. Perintah berikut melakukan trik:Garis miring terbalik digunakan untuk menunjukkan wildcard akan datang. * / JPG cocok dengan apa pun dengan ekstensi JPG. Di bagian "ke" dari perintah, # 1 menggunakan teks yang cocok dari wildcard pertama untuk mengubah nama file. Tentu saja, Anda dapat meletakkan jalur yang berbeda sebelum # 1 untuk juga memindahkan file.
sumber
coba kode ini
sumber
Coba ini:
sumber
mv
, yang terakhir yang (mungkin) bukan direktori. Dan itu tidak benar-benar menjawab pertanyaan - penanya ingin memindahkan sejumlah file, tidak semuanya.Saya datang ke sini, tetapi saya perlu menyalin file di bagian (masing-masing 99) dari
/DIR1
ke/DIR2
. Saya akan menempelkan skrip di sini untuk membantu otherz mungkin:sumber
perintah berikut berfungsi, jika Anda tertarik menggunakan
ls
Bagaimana cara kerjanya ??
ls -rt source/*
- perintah mencantumkan semua file dengan jalur relatifhead -n100
- Mengambil 100 file pertamaxargs cp -t destination
- Memindahkan file-file ini ke folder tujuansumber
Jika Anda ingin aman / menangani nama file dengan spasi, baris baru, tanda kutip, garis miring terbalik, dll. Anda harus menggunakan pemisah yang diakhiri dengan null:
EDIT2: CATATAN: jika Anda tidak memiliki
head -z
( untuk alasan apa pun ) Anda dapat mengganti yang di atashead -z -n 1000
dengantr '\0\n' '\n\0' | head -n 1000 | tr '\0\n' '\n\0'
(atau melihat cara lain )-maxdepth 1
akan menghindari mencari file dalam subdirektori dari$srcdir
, jadi satu-satunya yang terdaftar adalah file di dalamnya$srcdir
.-print0
akan menggunakan\0
alih-alih baris baru (\n
) antara setiap file yang terdaftar - ini membantu menangani file yang berisi baris baru dan spasi dengan xargs.head -z
akan menghitung\0
baris yang diakhiri (bukan baris baru (\n
) dihentikan sebagai baris.-n 100
akan mendaftar hanya100
file pertama yangfind
ditemukan.Jika Anda ingin melihat perintah apa yang
xargs
akan dijalankan, tambahkan-t
(atau--verbose
).xargs -0
"Item input diakhiri oleh karakter null (\0
) alih-alih oleh spasi, dan tanda kutip dan garis miring terbalik tidak spesial (setiap karakter diartikan secara harfiah)"xargs -r
tidak akan berjalanmv
jika tidak ada file yang akan dipindahkan (mis. jikafind
tidak menemukan file).--
mengakhiri pemrosesan argumen sebagai opsi untuk program, lebih detail di siniOutput sampel (menjalankan satu
mv
perintah dan dapat menangani file dengan baris baru di namanya juga):Untuk
find
:Untuk
head
:EDIT: Seseorang menyebutkan bahwa mereka tidak memiliki
head -z
, ini adalah versi yang saya gunakan (di Fedora 25):Untuk
xargs
:Untuk
cp
:sumber
Saya tahu utas ini cukup lama, tetapi saya menemukan jawabannya lebih rumit dari yang saya kira seharusnya. Ini berfungsi di CentOS, tetapi tampaknya cukup sederhana sehingga mungkin bisa digunakan di distro lain.
sumber
ls
tidak akan menyertakansomedir/
awalan terkemuka , dan tidak akan bekerja untuk nama file dengan karakter kosong atau wildcard atau mulai dengan-
.ls | head -n 100
../someDir100/ Dari dalam direktori target dan tidak ada nama file yang memenuhi kasus tersebut. Lebih baik beruntung maka bagus!