web-dev-qa-db-ja.com

ワイルドカードを使用して、ディレクトリではなくファイルのみを照合するにはどうすればよいですか?

home/homeLifeというフォルダがあります

/ homeに格納されているhome1、home2、home3というファイルがあります。

home*で始まるすべてのファイルをhome/homeLife/.に移動したい。

入力した

mv home* /home/homeLife
cannot move homeLife into subdirectory of itself

私の質問:ディレクトリを除外するにはどうすればよいですか?

8
Michael Bruce

zshでは、グロブ修飾子を使用します。

mv home*(.) dst 

regularファイルのみを移動します。

ながら

mv home*(^/) dst 

任意のタイプのファイルを移動しますexceptディレクトリ。

mv home*(^-/) dst

ディレクトリへのシンボリックリンクも除外します。

8

検索を使用できます。以下はうまくいくはずです。

find . -name home\* -type f -maxdepth 1 -exec mv {} /home/homeLife/. \;
4
Arul Selvan

移植性の高い方法でグロブ一致リストを整理できます。

set --; cd /home
for f in ./home*
do  [ ! -L "$f" ] && 
      [ -f "$f" ] && 
      set "$@" "$f"
done
[ "$#" -eq 0 ] || mv "$@" ./homeLife
2
mikeserv

あなたはすでに閉じています。ファイルを移動するにはhome1home2home3グロビングパターンを使用するhome?

mv home? /home/homeLife/

?は任意の1文字を示し、*は任意の文字数(なしを含む)を示します。

2
Janis

Bash拡張グロブを使用できます。

shopt -s extglob                ## activate extglogs if not yet done
mv  home!(*Life) homeLife/      ## !(p1|...) = anything except one of the patt
2
JJoao

もちろん、ファイルが3つしかない場合は、

_ mv home1 home2 home3 homeLife
_

ドキュメントを読むよりも、手動で行う方が簡単な場合があります。 _home*_という名前のファイルが本当に多数ある場合、私が使用する1つのトリック(現在はbashの一部です)は、グロブの一致をすべて展開し、不要な一致を手動で削除することです。グロブを展開するには、次のように入力します Ctrl+x* glob式を入力した後。コマンドラインで展開され、手動で修正します。

たとえば、私のディレクトリにたくさんの「テスト」ファイルがあり、それらすべてをに加えて_test2_の他に新しいファイルに分類したいとします。

_cat test*
_

今タイプしてください Ctrl+x*、そしてそれは

_cat test test10 test11 test12 test13 test14 test15 test16 test17 test2 test20 test21 test22 test23 test24 test25 test26 test27 test28 test29 test3 test30 test31 test32 test33 test34 test35 test36 test37 test38 test4 test5 test6 test7 test8 test9 testa testb testbuild testc testd teste testf
_

次にカーソルを戻して_test2_を5つのバックスペースで削除し、コマンドラインの最後に_> test_all_を追加します。

_cat test test10 test11 test12 test13 test14 test15 test16 test17 test20 test21 test22 test23 test24 test25 test26 test27 test28 test29 test3 test30 test31 test32 test33 test34 test35 test36 test37 test38 test4 test5 test6 test7 test8 test9 testa testb testbuild testc testd teste testf > test_all
_

他にもたくさんの機能があります Ctrl+x、しかしこれは私が覚えている唯一のものです。

0
Mark Lakata