何千ものファイルがあるディレクトリがあります。 100個のファイル(どのファイルでも可能)を別の場所に移動するにはどうすればよいですか。
_for file in $(ls -p | grep -v / | tail -100)
do
mv $file /other/location
done
_
これは、ファイル名に空白、改行(_$IFS
_のデフォルト値を想定)、ワイルドカード文字(_?
_、_*
_、_[
_)、または_-
_。
これはzshで最も簡単です。
mv -- *([1,100]) /other/location/
これにより、最初の100個の非表示ではないファイルが移動します(任意のタイプの([1,100])
から(.[1,100])
regularファイルのみ、または(^/[1,100])
(directory)以外のすべてのタイプの名前の辞書式順序。 o
glob qualifier を使用して別の並べ替え順序を選択できます。最も古い100個のファイルを移動するには:
mv -- *(Om[1,100]) /other/location/
他のシェルでは、早期に終了するループでそれを行うことができます。
i=0
for x in *; do
if [ "$i" = 100 ]; then break; fi
mv -- "$x" /other/location/
i=$((i+1))
done
別の移植可能な方法は ファイルのリストを作成し、最後の100を除くすべてを削除する です。
Zshを使用していない場合:
set -- *
[ "$#" -le 100 ] || shift "$(($# - 100))"
mv -- "$@" /target/dir
最後(アルファベット順)に100個移動します。
以下は私のために働いた。以前に投稿された場合は申し訳ありませんが、クイックスキャンでは表示されませんでした。
ls path/to/dir/containing/files/* | head -100 | xargs -I{} cp {} /Path/to/new/dir
シェルの次のワンライナーが役立ちます。
foreach i( `find Source_Directory -type f --max-depth 1 | tail -100`);行う; {mv $ i Target_Directory};完了
shuf -n 100 -e * | xargs -i mv {} path-to-new-folder
mmv は、ファイルの大量の名前変更もできる優れたユーティリティです。 (そうしなければならなかった Sudo apt-get install mmv
を使用してインストールします。)簡単な使用例:拡張子が.JPGで、小文字の.jpgに変更するファイルのディレクトリがあるとします。次のコマンドでうまくいきます。
mmv \*.JPG \#1.jpg
バックスラッシュは、ワイルドカードが近づいていることを示すために使用されます。 */JPGは、JPG拡張子を持つすべてのものと一致します。コマンドの「to」部分で、#1は最初のワイルドカードの一致するテキストを使用してファイルの名前を変更します。もちろん、#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
このコードを試してください
ls
の使用に興味がある場合は、次のコマンドが機能します
$ ls -rt source/* | head -n100 | xargs cp -t destination
これはどのように作動しますか ??
ls -rt source/*
-コマンドは、相対パスですべてのファイルをリストしますhead -n100
-最初の100ファイルを取得xargs cp -t destination
-これらのファイルを宛先フォルダに移動しますこれを試して:
find /source/directory -type f -maxdepth 1 -print | tail -100 | xargs -J % mv % /other/location/
スペース、改行、引用符、バックスラッシュなどを含むファイル名を安全に処理したい場合は、nullで終了するセパレータを使用する必要があります。
find "$srcdir" -maxdepth 1 -type f -print0 | head -z -n 100 | xargs -0 -r -- mv -t "$destdir" --
EDIT2:注:head -z
(- 何らかの理由で )上記のhead -z -n 1000
をtr '\0\n' '\n\0' | head -n 1000 | tr '\0\n' '\n\0'
に置き換えることができます(または 他の方法を参照 )
-maxdepth 1
は、$srcdir
のサブディレクトリにあるファイルを検索しないようにするため、リストされているのは$srcdir
内のファイルのみです。-print0
は、リストされた各ファイル間でnewline(\0
)の代わりに\n
を使用します-これは、改行とxargsを含むスペースを含むファイルの処理に役立ちます。head -z
は、(newline(\0
)で終了するのではなく)\n
で終了する行を行としてカウントします。 -n 100
は、find
が検出した最初の100
ファイルのみをリストします。xargs
が実行するコマンドを確認する場合は、-t
(または--verbose
)を追加します。xargs -0
"入力項目は空白文字ではなくnull(\0
)文字で終了し、引用符とバックスラッシュは特別ではありません(すべての文字が文字どおりに使用されます)"xargs -r
は、移動するファイルがない場合(つまり、mv
がファイルを検出しなかった場合)find
を実行しません。--
は、プログラムのオプションとしての引数の処理を終了します。詳細 ここ
出力例(mv
コマンドを1つ実行し、名前に改行が含まれるファイルも処理できます):
$ 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'
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.
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:誰か 言及 彼らがhead -z
を持っていなかったこと、これは私が使用していたバージョンです(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
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.
cp
の場合:
-t, --target-directory=DIRECTORY
copy all SOURCE arguments into DIRECTORY
-v, --verbose
explain what is being done
私はここまで来ましたが、/DIR1
から/DIR2
。ここにスクリプトを貼り付けて、おそらくotherzを支援します。
#!/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
https://unix.stackexchange.com/a/105042/66736 に触発された別のバリエーション:
cp `ls -d ./* | head -n 100` tmpi
これは最速または最もエレガントな方法ではないかもしれませんが、メモリに保持できる方法です。