diff --git a/Base/usr/share/man/man1/ls.md b/Base/usr/share/man/man1/ls.md index 6626e9581888b9..ae967a3dff3784 100644 --- a/Base/usr/share/man/man1/ls.md +++ b/Base/usr/share/man/man1/ls.md @@ -21,6 +21,7 @@ If no *path* argument is provided the current working directory is used. * `-A`: Do not list implied . and .. directories * `-B`, `--ignore-backups`: Do not list implied entries ending with ~ * `-F`, `--classify`: Append a file type indicator to entries +* `-p`: Append a '/' indicator to directories * `-d`, `--directory`: List directories themselves, not their contents * `-l`, `--long`: Display long info * `-t`: Sort files by timestamp (newest first) diff --git a/Userland/Utilities/ls.cpp b/Userland/Utilities/ls.cpp index 13a91c746df767..89a39447e94a3a 100644 --- a/Userland/Utilities/ls.cpp +++ b/Userland/Utilities/ls.cpp @@ -49,6 +49,15 @@ enum class FieldToSortBy { Size }; +enum class IndicatorStyle { + None = 0, + Directory = 1 << 0, + Executable = 1 << 1, + SymbolicLink = 1 << 2, + Classify = Directory | Executable | SymbolicLink +}; +AK_ENUM_BITWISE_OPERATORS(IndicatorStyle) + static int do_file_system_object_long(DeprecatedString const& path); static int do_file_system_object_short(DeprecatedString const& path); @@ -56,7 +65,7 @@ static bool print_names(char const* path, size_t longest_name, Vector serenity_main(Main::Arguments arguments) args_parser.add_option(flag_sort_by, FieldToSortBy::ModifiedAt, "Sort files by timestamp (newest first)", nullptr, 't'); args_parser.add_option(flag_sort_by, FieldToSortBy::Size, "Sort files by size (largest first)", nullptr, 'S'); args_parser.add_option(flag_reverse_sort, "Reverse sort order", "reverse", 'r'); - args_parser.add_option(flag_classify, "Append a file type indicator to entries", "classify", 'F'); + args_parser.add_option(flag_indicator_style, IndicatorStyle::Classify, "Append a file type indicator to entries", "classify", 'F'); + args_parser.add_option(flag_indicator_style, IndicatorStyle::Directory, "Append a '/' indicator to directories", nullptr, 'p'); args_parser.add_option(flag_colorize, "Use pretty colors", nullptr, 'G'); args_parser.add_option(flag_show_inode, "Show inode ids", "inode", 'i'); args_parser.add_option(flag_show_raw_inode, "Show raw inode ids if possible", "raw-inode", 'I'); @@ -292,14 +302,14 @@ static size_t print_name(const struct stat& st, DeprecatedString const& name, Op nprinted += printf(" -> ") + print_escaped(link_destination_or_error.value()); } } else { - if (flag_classify) + if (has_flag(flag_indicator_style, IndicatorStyle::SymbolicLink)) nprinted += printf("@"); } } else if (S_ISDIR(st.st_mode)) { - if (flag_classify) + if (has_flag(flag_indicator_style, IndicatorStyle::Directory)) nprinted += printf("/"); } else if (st.st_mode & 0111) { - if (flag_classify) + if (has_flag(flag_indicator_style, IndicatorStyle::Executable)) nprinted += printf("*"); }