回答:
現在のディレクトリが次の場合、次のことができますparent_directory
。
for d in [0-9][0-9][0-9]
do
( cd "$d" && your-command-here )
done
(
そして)
、現在のディレクトリは、メインスクリプトで変更されていないので、サブシェルを作成します。
for f in foo bar; do cat "$f"/*.txt; done >output
機能的にはと同等cat foo/*.txt bar/*.txt >output
です。ただし、ls
引数を渡す方法に応じてわずかに異なる出力を生成する1つのコマンドです。同様に、相対ファイル名を出力するgrep
またはwc
は、サブディレクトリから実行する場合は異なります(ただし、そのためにサブディレクトリに移動することは避けたい場合があります)。
find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c "cd '{}' && pwd" \;
\( ! -name . \)
カレントディレクトリにあるコマンドを実行する避けることができます。
find FOLDER* -maxdepth 0 -type d \( ! -name . \) -exec bash -c "cd '{}' && pwd" \;
-exec bash -c 'cd "$0" && pwd' {} \;
一部のディレクトリには一重引用符と二重引用符が含まれていたため、私はやらなければなりませんでした。
-mindepth 1
pwd
直接ではなく「git remote get-url origin」のようなコマンドを受け入れますか?
disd(){find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c 'cd "{}" && "$@"' \;}
うまくいかない。
GNUを使用している場合はfind
、-execdir
パラメータを試すことができます。例:
find . -type d -execdir realpath "{}" ';'
または(@gniourf_gniourfコメントに従って):
find . -type d -execdir sh -c 'printf "%s/%s\n" "$PWD" "$0"' {} \;
注:${0#./}
代わりに$0
を使用./
して、前面を修正できます。
またはより実用的な例:
find . -name .git -type d -execdir git pull -v ';'
現在のディレクトリを含めたい場合は、以下を使用することでさらに簡単になり-exec
ます。
find . -type d -exec sh -c 'cd -P -- "{}" && pwd -P' \;
または使用xargs
:
find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'
または@gniourf_gniourfによって提案された同様の例:
find . -type d -print0 | while IFS= read -r -d '' file; do
# ...
done
上記の例は、名前にスペースが含まれるディレクトリをサポートしています。
または、bash配列に割り当てることによって:
dirs=($(find . -type d))
for dir in "${dirs[@]}"; do
cd "$dir"
echo $PWD
done
.
特定のフォルダ名に変更します。再帰的に実行する必要がない場合は、dirs=(*)
代わりに:を使用できます。上記の例では、名前にスペースが含まれるディレクトリはサポートされていません。
したがって、@ gniourf_gniourfが示唆しているように、明示的なループを使用せずにfindの出力を配列に配置する唯一の適切な方法は、次のBash 4.4で利用できます。
mapfile -t -d '' dirs < <(find . -type d -print0)
ls -d */ | awk '{print $NF}' | xargs -n1 sh -c 'cd $0 && pwd && echo Do stuff'
上記の例では、(OPからの要求に応じて)現在のディレクトリは無視されますが、名前がスペースで区切られます。
以下も参照してください。
find
明示的なループを使用せずに配列の出力を配置する唯一の適切な方法は、Bash 4.4 withで使用できるようになりますmapfile -t -d '' dirs < <(find . -type d -print0)
。それまでは、ループを使用する(または操作をに延期するfind
)ことが唯一の選択肢です。
dirs
配列は実際には必要ありません。あなたは上のループ可能性find
の出力(安全に)そうのように:find . -type d -print0 | while IFS= read -r -d '' file; do ...; done
。
IFS
およびread
(ご存知のとおり)慣れると第2の性質になります。これらは、スクリプトを作成する標準的で慣用的な方法の一部です。
find . -type d -execdir echo $(pwd)/{} ';'
は$(pwd)
find
トップレベルのフォルダーがわかっている場合は、次のように記述できます。
for dir in `ls $YOUR_TOP_LEVEL_FOLDER`;
do
for subdir in `ls $YOUR_TOP_LEVEL_FOLDER/$dir`;
do
$(PLAY AS MUCH AS YOU WANT);
done
done
$(PLAY AS MUCH AS YOU WANT)); 好きなだけコードを入れることができます。
どのディレクトリでも「cd」しなかったことに注意してください。
乾杯、
ls
」ここには-あなただけ行うことができますfor dir in $YOUR_TOP_LEVEL_FOLDER/*
代わりに。
ls $dir
表現を使用した理由です
1つのライナーは迅速で汚い使用法に適していますが、スクリプトを書くために以下のより詳細なバージョンを好みます。これは私が使用するテンプレートで、多くのエッジケースを処理し、より複雑なコードを記述してフォルダーで実行できます。関数dir_commandでbashコードを記述できます。以下では、dir_coomandは、例としてgitの各リポジトリにタグを付けることを実装しています。スクリプトの残りの部分では、ディレクトリ内の各フォルダーに対してdir_commandを呼び出します。フォルダーの特定のセットのみを反復する例も含まれています。
#!/bin/bash
#Use set -x if you want to echo each command while getting executed
#set -x
#Save current directory so we can restore it later
cur=$PWD
#Save command line arguments so functions can access it
args=("$@")
#Put your code in this function
#To access command line arguments use syntax ${args[1]} etc
function dir_command {
#This example command implements doing git status for folder
cd $1
echo "$(tput setaf 2)$1$(tput sgr 0)"
git tag -a ${args[0]} -m "${args[1]}"
git push --tags
cd ..
}
#This loop will go to each immediate child and execute dir_command
find . -maxdepth 1 -type d \( ! -name . \) | while read dir; do
dir_command "$dir/"
done
#This example loop only loops through give set of folders
declare -a dirs=("dir1" "dir2" "dir3")
for dir in "${dirs[@]}"; do
dir_command "$dir/"
done
#Restore the folder
cd "$cur"
あなたは使うことができます
find .
現在のディレクトリ内のすべてのファイル/ディレクトリを検索するには
あなたはそのようにxargsコマンドで出力をパイプすることができますより
find . | xargs 'command here'
for p in [0-9][0-9][0-9];do
(
cd $p
for f in [0-9][0-9][0-9][0-9]*.txt;do
ls $f; # Your operands
done
)
done
cd
、サブシェルで変更する必要があります。
cd
ため、このコードは実際には何も有用ではありません。
cd "$d"
ワイルドカードが名前に空白やシェルのメタ文字を含むファイルと一致する状況に転送されるという点で優れています。