Skip to main content
updated the first snippet with changes from the second
Source Link

You should not be doing mv or cp inside awk. The following works:

for i in * ; do
  [ -f "$i" ] || continue
  dir_name="$(echo $i | awk -F'_' '{print $1}')"
  mkdir -p -- "$dir_name"
  cp -- "$i" "$dir_name"
done

However, instead of awk, you could use the % operator in bash to remove everything after the first underscore to get the directory name.

for i in * ; do
  [ -f "$i" ] || continue
  dir_name="${i%%_*}"
  mkdir -p -- "$dir_name"
  cp -- "$i" "$dir_name"
done

(use mv instead of cp if you want to move)

You should not be doing mv or cp inside awk. The following works:

for i in * ; do
  [ -f "$i" ] || continue
  dir_name="$(echo $i | awk -F'_' '{print $1}')"
  mkdir -p "$dir_name"
  cp "$i" "$dir_name"
done

However, instead of awk, you could use the % operator in bash to remove everything after the first underscore to get the directory name.

for i in * ; do
  [ -f "$i" ] || continue
  dir_name="${i%%_*}"
  mkdir -p -- "$dir_name"
  cp -- "$i" "$dir_name"
done

(use mv instead of cp if you want to move)

You should not be doing mv or cp inside awk. The following works:

for i in * ; do
  [ -f "$i" ] || continue
  dir_name="$(echo $i | awk -F'_' '{print $1}')"
  mkdir -p -- "$dir_name"
  cp -- "$i" "$dir_name"
done

However, instead of awk, you could use the % operator in bash to remove everything after the first underscore to get the directory name.

for i in * ; do
  [ -f "$i" ] || continue
  dir_name="${i%%_*}"
  mkdir -p -- "$dir_name"
  cp -- "$i" "$dir_name"
done

(use mv instead of cp if you want to move)

avoid filenames that look like options to mkdir or cp
Source Link
Jeff Schaller
  • 68.8k
  • 35
  • 122
  • 265

You should not be doing mv or cp inside awk. The following works:

for i in * ; do
  [ -f "$i" ] || continue
  dir_name="$(echo $i | awk -F'_' '{print $1}')"
  mkdir -p "$dir_name"
  cp "$i" "$dir_name"
done

However, instead of awk, you could use the % operator in bash to remove everything after the first underscore to get the directory name.

for i in * ; do
  [ -f "$i" ] || continue
  dir_name="${i%%_*}"
  mkdir -p -- "$dir_name"
  cp -- "$i" "$dir_name"
done

(use mv instead of cp if you want to move)

You should not be doing mv or cp inside awk. The following works:

for i in * ; do
  [ -f "$i" ] || continue
  dir_name="$(echo $i | awk -F'_' '{print $1}')"
  mkdir -p "$dir_name"
  cp "$i" "$dir_name"
done

However, instead of awk, you could use the % operator in bash to remove everything after the first underscore to get the directory name.

for i in * ; do
  [ -f "$i" ] || continue
  dir_name="${i%%_*}"
  mkdir -p "$dir_name"
  cp "$i" "$dir_name"
done

(use mv instead of cp if you want to move)

You should not be doing mv or cp inside awk. The following works:

for i in * ; do
  [ -f "$i" ] || continue
  dir_name="$(echo $i | awk -F'_' '{print $1}')"
  mkdir -p "$dir_name"
  cp "$i" "$dir_name"
done

However, instead of awk, you could use the % operator in bash to remove everything after the first underscore to get the directory name.

for i in * ; do
  [ -f "$i" ] || continue
  dir_name="${i%%_*}"
  mkdir -p -- "$dir_name"
  cp -- "$i" "$dir_name"
done

(use mv instead of cp if you want to move)

fix
Source Link

You should not be doing mv or cp inside awk. The following works:

for i in $(find* .; -typedo
  [ -f) ;"$i" do] || continue
  dir_name="$(echo $i | awk -F'_' '{print $1}')"
  mkdir -p "$dir_name"
  cp "$i" "$dir_name"
done

However, instead of awk, you could use the % operator in bash to remove everything after the first underscore to get the directory name.

for i in $(find* .; -typedo
  [ -f) ;"$i" do] || continue
  dir_name="${i%%_*}"
  mkdir -p "$dir_name"
  cp "$i" "$dir_name"
done

(use mv instead of cp if you want to move)

You should not be doing mv or cp inside awk. The following works:

for i in $(find . -type f) ; do
  dir_name="$(echo $i | awk -F'_' '{print $1}')"
  mkdir -p "$dir_name"
  cp "$i" "$dir_name"
done

However, instead of awk, you could use the % operator in bash to remove everything after the first underscore to get the directory name.

for i in $(find . -type f) ; do
  dir_name="${i%%_*}"
  mkdir -p "$dir_name"
  cp "$i" "$dir_name"
done

(use mv instead of cp if you want to move)

You should not be doing mv or cp inside awk. The following works:

for i in * ; do
  [ -f "$i" ] || continue
  dir_name="$(echo $i | awk -F'_' '{print $1}')"
  mkdir -p "$dir_name"
  cp "$i" "$dir_name"
done

However, instead of awk, you could use the % operator in bash to remove everything after the first underscore to get the directory name.

for i in * ; do
  [ -f "$i" ] || continue
  dir_name="${i%%_*}"
  mkdir -p "$dir_name"
  cp "$i" "$dir_name"
done

(use mv instead of cp if you want to move)

replaced ls
Source Link
Loading
fix
Source Link
Loading
Source Link
Loading